1 |
|
---|
2 | ATK2 éä¿¡é ¼ISRå¯¾å¿ è¨è¨ã¡ã¢ =CONFIDENTIAL=
|
---|
3 | 対å¿ãã¼ã¸ã§ã³: Release 1.4.1
|
---|
4 | æçµæ´æ°: 2016å¹´3æ4æ¥
|
---|
5 |
|
---|
6 | Copyright (C) 2016 by Center for Embedded Computing Systems
|
---|
7 | Graduate School of Information Science, Nagoya Univ\., JAPAN
|
---|
8 |
|
---|
9 | $Id: ntisr_design_memo.txt 250 2016-03-17 01:54:59Z t_ishikawa $
|
---|
10 |
|
---|
11 | ãã®ããã¥ã¡ã³ãã¯ï¼TOPPERS/ATK2ã«ããã¦ï¼éä¿¡é ¼ISRããµãã¼ãããããã®
|
---|
12 | è¨è¨ã¡ã¢ã§ããï¼ä½æéä¸ã®ãã®ã§ããï¼ç¶²ç¾
|
---|
13 | çã§ã¯ãªãï¼
|
---|
14 |
|
---|
15 | ======================================================================
|
---|
16 | ⯠ç¨èªã®å®ç¾©ããã³è¡¨è¨ã«ã¼ã«
|
---|
17 | ======================================================================
|
---|
18 |
|
---|
19 | ã»æ±ç¨ã¬ã¸ã¹ã¿ï¼ããã»ããµã®æã¤ã¬ã¸ã¹ã¿ã§ï¼å®è¡ä¸å¦çåä½ã®ã³ã³ããã¹ãã
|
---|
20 | ã管çããããã«å¿
|
---|
21 | è¦ãªãã®ãã¹ã¦
|
---|
22 | ã»spï¼ããã»ããµã®æã¤ã¹ã¿ãã¯ãã¤ã³ã¿ã¬ã¸ã¹ã¿
|
---|
23 | ã»pcï¼ããã»ããµã®æã¤ããã°ã©ã ã«ã¦ã³ã¿ã¬ã¸ã¹ã¿
|
---|
24 | ã»ã·ã¼ã±ã³ã¹ä¸ã«ãã "xxx<label>:"ã¨ããè¨è¿°ã¯ï¼Cè¨èªãã¢ã»ã³ããªè¨èªã®
|
---|
25 | ãã©ãã«ã«ç¸å½ãã
|
---|
26 | ã»ã·ã¼ã±ã³ã¹ä¸ã«ãã "xxx()"ã¨ããè¨è¿°ã¯ï¼Cè¨èªãã¢ã»ã³ããªè¨èªã®
|
---|
27 | ãé¢æ°å¼åºãã«ç¸å½ãã
|
---|
28 | ã»ã·ã¼ã±ã³ã¹ä¸ã«ãã "<<xxx>>"ã¨ããè¨è¿°ã¯ï¼ç¹å®ã®SC/MC/TPã«ã®ã¿åå¨ãã
|
---|
29 | ããã¨ã表ã
|
---|
30 |
|
---|
31 | ======================================================================
|
---|
32 | ⯠大åæ
|
---|
33 | ======================================================================
|
---|
34 |
|
---|
35 | ã»ç¹æ¨©ã¢ã¼ãå®è¡æã«ä¿è·éåãçºçããã¨ï¼ç¡è¦ãOSã·ã£ãããã¦ã³ããã§ããªã
|
---|
36 | ã»p_runtskã¯ï¼dispatcherã®ã¿ã§æ´æ°ããã
|
---|
37 |
|
---|
38 | ======================================================================
|
---|
39 | ⯠ã³ã³ããã¹ããã¨ã«ä½¿ç¨ããã¹ã¿ãã¯
|
---|
40 | ======================================================================
|
---|
41 | TASK<<MC/TP以å¤>> æ¡å¼µã¿ã¹ã¯ï¼åå¥ã®ã¦ã¼ã¶ã¹ã¿ãã¯&ã·ã¹ãã ã¹ã¿ãã¯
|
---|
42 | åºæ¬ã¿ã¹ã¯ï¼åªå
|
---|
43 | 度æ¯ã®ã¦ã¼ã¶ã¹ã¿ãã¯&ã·ã¹ãã ã¹ã¿ãã¯
|
---|
44 | TASK<<MC>> æ¡å¼µã¿ã¹ã¯ï¼åå¥ã®ã¦ã¼ã¶ã¹ã¿ãã¯&ã·ã¹ãã ã¹ã¿ãã¯
|
---|
45 | åºæ¬ã¿ã¹ã¯ï¼ã³ã¢æ¯ãã¤åªå
|
---|
46 | 度æ¯ã®ã¦ã¼ã¶ã¹ã¿ãã¯&ã·ã¹ãã
|
---|
47 | ã¹ã¿ãã¯
|
---|
48 | TASK<<TP>> æ¡å¼µã¿ã¹ã¯ï¼åå¥ã®ã¦ã¼ã¶ã¹ã¿ãã¯&ã·ã¹ãã ã¹ã¿ãã¯
|
---|
49 | åºæ¬ã¿ã¹ã¯ï¼ã¦ã£ã³ãã¦æ¯ãã¤åªå
|
---|
50 | 度æ¯ã®ã¦ã¼ã¶ã¹ã¿ãã¯&
|
---|
51 | ã·ã¹ãã ã¹ã¿ãã¯
|
---|
52 | C2ISR<<MC/TP以å¤>> åªå
|
---|
53 | 度æ¯ã®ã¦ã¼ã¶ã¹ã¿ãã¯&ã·ã¹ãã ã¹ã¿ãã¯
|
---|
54 | C2ISR<<MC>> ã³ã¢æ¯ãã¤åªå
|
---|
55 | 度æ¯ã®ã¦ã¼ã¶ã¹ã¿ãã¯&ã·ã¹ãã ã¹ã¿ãã¯
|
---|
56 | C2ISR<<TP>> ã¦ã£ã³ãã¦æ¯ãã¤åªå
|
---|
57 | 度æ¯ã®ã¦ã¼ã¶ã¹ã¿ãã¯&ã·ã¹ãã ã¹ã¿ãã¯
|
---|
58 | C1ISR OS管çå¤
|
---|
59 | ããã¯ã«ã¼ãã³ OSã¹ã¿ãã¯
|
---|
60 | ã¢ã¤ãã«ã«ã¼ã OSã¹ã¿ã㯠â»ã¿ã¹ã¯ãåå¨ããªãconfigãèæ
|
---|
61 | ®
|
---|
62 | OSå²è¾¼ã¿ OSã¹ã¿ãã¯
|
---|
63 | mainé¢æ° OSã¹ã¿ãã¯
|
---|
64 |
|
---|
65 | â ããã¯ã«ã¼ãã³(1)âC1ISRâããã¯ã«ã¼ãã³(2)ã¨ãã¹ãããå ´åï¼ãã¤ï¼
|
---|
66 | C1ISRãç¬èªã®ã¹ã¿ãã¯ã使ç¨ãã¦ããå ´åï¼ããã¯ã«ã¼ãã³(1)ã®ä½¿ç¨ãã
|
---|
67 | ç¶ãããã¹ã¿ãã¯ã使ç¨ããå¿
|
---|
68 | è¦ããããï¼ããã¨ãC1ISRã§çºçãã
|
---|
69 | ããã¯ã«ã¼ãã³ã§ã¯ï¼ãã®ã¨ãã®ã¹ã¿ãã¯(C1ISRã®ã¹ã¿ãã¯)ããã®ã¾ã¾
|
---|
70 | 使ç¨ããã°ãããï¼
|
---|
71 |
|
---|
72 | ======================================================================
|
---|
73 | ⯠ã³ã³ããã¹ãã¨ãã¦ä¿åãã¹ãæ
|
---|
74 | å ±
|
---|
75 | ======================================================================
|
---|
76 | æ±ç¨ã¬ã¸ã¹ã¿
|
---|
77 | å²è¾¼ã¿åªå
|
---|
78 | 度ãã¹ã¯ ISRã®å¼·å¶çµäºã«åãã
|
---|
79 | callevel
|
---|
80 | pc
|
---|
81 | ã¦ã¼ã¶ã¹ã¿ãã¯sp
|
---|
82 | ã·ã¹ãã ã¹ã¿ãã¯sp
|
---|
83 |
|
---|
84 | ======================================================================
|
---|
85 | ⯠ã³ã³ããã¹ãåæ¿å¦çã®è¨è¨
|
---|
86 | ======================================================================
|
---|
87 |
|
---|
88 | ======================================================================
|
---|
89 | â start_dispatch
|
---|
90 | æ¦è¦:
|
---|
91 | ã»StartOSçµäºå¾ã«å¦çåä½ãèµ·åãã
|
---|
92 | ã³ã³ããã¹ãåæ¿:
|
---|
93 | ã»mainé¢æ° â ã¿ã¹ã¯
|
---|
94 | ã»mainé¢æ° â ã¢ã¤ãã«ã«ã¼ã
|
---|
95 | åæ:
|
---|
96 | ã»å
|
---|
97 | ¨å²è¾¼ã¿ç¦æ¢ç¶æ
|
---|
98 | ã§å¼ã°ãã
|
---|
99 | ã»saved_ostkpt == NULL
|
---|
100 | ã·ã¼ã±ã³ã¹:
|
---|
101 | sp = _ostkpt
|
---|
102 | OSå²è¾¼ã¿ç¦æ¢
|
---|
103 | å
|
---|
104 | ¨å²è¾¼ã¿ç¦æ¢ã解é¤
|
---|
105 | dispatcher_0()
|
---|
106 |
|
---|
107 | ======================================================================
|
---|
108 | â dispatch
|
---|
109 | æ¦è¦:
|
---|
110 | ã»ã¿ã¹ã¯ã³ã³ããã¹ãããAPIãå¼ã³åºãï¼ãã®ä¸ã§ã¿ã¹ã¯åæ¿ã
|
---|
111 | ãçºçãã
|
---|
112 | ã³ã³ããã¹ãåæ¿:
|
---|
113 | ã»ã¿ã¹ã¯ â ã¿ã¹ã¯
|
---|
114 | åæ:
|
---|
115 | ã»OSå²è¾¼ã¿ç¦æ¢ç¶æ
|
---|
116 | ã§å¼ã°ãã
|
---|
117 | ã»sp == å¼åºãå
|
---|
118 | ã¿ã¹ã¯ã®ã·ã¹ãã ã¹ã¿ãã¯
|
---|
119 | ã»å¼åºãå
|
---|
120 | ã¿ã¹ã¯ã®ã¦ã¼ã¶ã¹ã¿ãã¯ãã¤ã³ã¿ã¯ï¼ã·ã¹ãã ãµã¼ãã¹
|
---|
121 | ãã®å
|
---|
122 | ¥ãå£ã§ä¿åæ¸ã¿
|
---|
123 | ã»å¼åºãå
|
---|
124 | ã¿ã¹ã¯ã®caller-savedã¬ã¸ã¹ã¿ã¯ï¼dispatchå¼åºãæã«
|
---|
125 | ãå¼åºãå
|
---|
126 | ã¿ã¹ã¯ã®ã·ã¹ãã ã¹ã¿ãã¯ã«ä¿åæ¸ã¿
|
---|
127 | ã»callevel == TCL_TASK | TSYS_NULL
|
---|
128 | ã»å²è¾¼ã¿åªå
|
---|
129 | 度ãã¹ã¯å
|
---|
130 | ¨è§£é¤ç¶æ
|
---|
131 |
|
---|
132 | ã»ãã£ã¹ãããä¿çç¶æ
|
---|
133 | ã§ãªãï¼TPã§ã®OSAPéãªã½ã¼ã¹åå¾ç¶æ
|
---|
134 | ã§ãªãï¼
|
---|
135 | ã·ã¼ã±ã³ã¹:
|
---|
136 | callee-savedã¬ã¸ã¹ã¿ãå¼åºãå
|
---|
137 | ã¿ã¹ã¯ã®ã·ã¹ãã ã¹ã¿ãã¯ã«ä¿å
|
---|
138 | spãå¼åºãå
|
---|
139 | ã¿ã¹ã¯ã®TCB.spã«ä¿å
|
---|
140 | dispatch_rãå¼åºãå
|
---|
141 | ã¿ã¹ã¯ã®TCB.pcã«ä¿å
|
---|
142 | å®è¡ä¸ã¿ã¹ã¯ã®ã·ã¹ãã ã¹ã¿ãã¯ã®ã¢ãã¿ãªã³ã°
|
---|
143 | 4-1. ã¹ã¿ãã¯ãã¤ã³ã¿ãã§ãã¯
|
---|
144 | 4-2. ãã¸ãã¯ãã³ãã¼ãã§ãã¯
|
---|
145 | dispatcher()
|
---|
146 |
|
---|
147 | ======================================================================
|
---|
148 | â dispatch_r
|
---|
149 | æ¦è¦:
|
---|
150 | ã»APIå¼åºã(dispatchå¼åºã)ã§ããªã¨ã³ãããããã¿ã¹ã¯ã³ã³ããã¹ã
|
---|
151 | ãã®å¾©å¸°
|
---|
152 | ã³ã³ããã¹ãåæ¿:
|
---|
153 | ã»ã¿ã¹ã¯ â ã¿ã¹ã¯
|
---|
154 | åæ:
|
---|
155 | ã»OSå²è¾¼ã¿ç¦æ¢ç¶æ
|
---|
156 | ã§å¼ã°ãã
|
---|
157 | ã»sp == å¼åºãå
|
---|
158 | ã¿ã¹ã¯ã®ã·ã¹ãã ã¹ã¿ãã¯
|
---|
159 | ã»å¼åºãå
|
---|
160 | ã¿ã¹ã¯ã®ã¦ã¼ã¶ã¹ã¿ãã¯ãã¤ã³ã¿ã¯ï¼ã·ã¹ãã ãµã¼ãã¹
|
---|
161 | ãã®åºå£ã§å¾©å¸°ããã
|
---|
162 | ã»å¼åºãå
|
---|
163 | ã¿ã¹ã¯ã®caller-savedã¬ã¸ã¹ã¿ã¯ï¼dispatch_rããã®ãªã¿ã¼ã³
|
---|
164 | æã«å¼åºãå
|
---|
165 | ã¿ã¹ã¯ã®ã·ã¹ãã ã¹ã¿ãã¯ãã復帰ããã
|
---|
166 | ã»callevel == TCL_TASK | TSYS_NULL
|
---|
167 | ã»å²è¾¼ã¿åªå
|
---|
168 | 度ãã¹ã¯å
|
---|
169 | ¨è§£é¤ç¶æ
|
---|
170 |
|
---|
171 | ã»ãã£ã¹ãããä¿çç¶æ
|
---|
172 | ã§ãªãï¼TPã§ã®OSAPéãªã½ã¼ã¹åå¾ç¶æ
|
---|
173 | ã§ãªãï¼
|
---|
174 | ã·ã¼ã±ã³ã¹:
|
---|
175 | callee-savedã¬ã¸ã¹ã¿ãå¼åºãå
|
---|
176 | ã¿ã¹ã¯ã®ã·ã¹ãã ã¹ã¿ãã¯ãã復帰
|
---|
177 | return;
|
---|
178 |
|
---|
179 | ======================================================================
|
---|
180 | â C2ISRåºå
|
---|
181 | ¥ãå£
|
---|
182 | æ¦è¦(a):
|
---|
183 | ã»å²è¾¼ã¿çºçã«ä¼´ãã³ã³ããã¹ãåæ¿ããã³C2ISRã®èµ·å
|
---|
184 | æ¦è¦(b):
|
---|
185 | ã»ISRçµäºã«ä¼´ãã³ã³ããã¹ãåæ¿
|
---|
186 | ã»ãã®æç¹ã§ã¯å®è¡ä¸ã¿ã¹ã¯ã®åæ¿ã¯ã¾ã çºçããªã
|
---|
187 | æ¦è¦(c):
|
---|
188 | ã»ISRä¸ã«çããã¿ã¹ã¯åæ¿è¦æ±ã«ä¼´ãé
|
---|
189 | 延ã¿ã¹ã¯ãã£ã¹ããã
|
---|
190 | æ¦è¦(d):
|
---|
191 | ã»é
|
---|
192 | 延ã¿ã¹ã¯ãã£ã¹ãããããã¿ã¹ã¯ã³ã³ããã¹ãã®å¾©å¸°
|
---|
193 | ã³ã³ããã¹ãåæ¿(a):
|
---|
194 | ã»ã¿ã¹ã¯ â C2ISR
|
---|
195 | ã»C2ISR â C2ISR
|
---|
196 | ã»ã¢ã¤ãã« â C2ISR
|
---|
197 | ã³ã³ããã¹ãåæ¿(b):
|
---|
198 | ã»C2ISR â ã¿ã¹ã¯ï¼é常çµäºï¼
|
---|
199 | ã»C2ISR â C2ISRï¼é常çµäºï¼
|
---|
200 | ã»C2ISR â ã¢ã¤ãã«ï¼é常çµäºï¼
|
---|
201 | ã»ããã¯ã«ã¼ãã³ â C2ISRï¼C2ISRå¼·å¶çµäºï¼
|
---|
202 | ã»ããã¯ã«ã¼ãã³ â ã¿ã¹ã¯ï¼C2ISRå¼·å¶çµäºï¼
|
---|
203 | ã»ããã¯ã«ã¼ãã³ â ã¢ã¤ãã«ï¼C2ISRå¼·å¶çµäºï¼
|
---|
204 | ã³ã³ããã¹ãåæ¿(c):
|
---|
205 | ã»ã¿ã¹ã¯ â ã¿ã¹ã¯
|
---|
206 | ã³ã³ããã¹ãåæ¿(d):
|
---|
207 | ã»ã¿ã¹ã¯ â ã¿ã¹ã¯
|
---|
208 | åæ:
|
---|
209 | ã»callevel == TCL_NULL || TCL_TASK || TCL_ISR2 | TSYS_NULL
|
---|
210 | ã·ã¼ã±ã³ã¹:
|
---|
211 | ------------------------------ ãããã(a) ------------------------------
|
---|
212 | å°ãªãã¨ãOSå²è¾¼ã¿ç¦æ¢ç¶æ
|
---|
213 | ã¨ãã
|
---|
214 | if (å²è¾¼ã¿çºçæã«ã¦ã¼ã¶ã¢ã¼ã) :
|
---|
215 | if (p_runisr != NULL) : // C2ISRã³ã³ããã¹ãã§å²è¾¼ã¿çºç
|
---|
216 | p_runisr->usp = sp; // ã¦ã¼ã¶ã¹ã¿ãã¯ãã¤ã³ã¿ã®ä¿å
|
---|
217 | sp = p_runisr->p_isrinib->sstk_bottom; // ã·ã¹ãã ã¹ã¿ãã¯ã«åæ¿ã
|
---|
218 | else : // ã¿ã¹ã¯ã³ã³ããã¹ãã§å²è¾¼ã¿çºç
|
---|
219 | p_runtsk->usp = sp; // ã¦ã¼ã¶ã¹ã¿ãã¯ãã¤ã³ã¿ã®ä¿å
|
---|
220 | sp = p_runtsk->p_tinib->sstk_bottom; // ã·ã¹ãã ã¹ã¿ãã¯ã«åæ¿ã
|
---|
221 | /*
|
---|
222 | * ãã®æç¹ã§ï¼spã¯ä»¥ä¸ã®ãããããæãã¦ãã
|
---|
223 | * - ã¿ã¹ã¯ã®ã·ã¹ãã ã¹ã¿ãã¯
|
---|
224 | * - ISRã®ã·ã¹ãã ã¹ã¿ãã¯
|
---|
225 | * - OSã¹ã¿ãã¯ï¼ã¢ã¤ãã«ã«ã¼ãã®ã³ã³ããã¹ãï¼
|
---|
226 | */
|
---|
227 | ãã¹ã¦ã®æ±ç¨ã¬ã¸ã¹ã¿ãspã«ä¿å
|
---|
228 | å²è¾¼ã¿çºçæã®å²è¾¼ã¿åªå
|
---|
229 | 度ãã¹ã¯ãspã«ä¿å
|
---|
230 | å²è¾¼ã¿çºçæã®callevelãspã«ä¿å
|
---|
231 | /* ãã®æç¹ã§ã®spãæãã¹ã¿ãã¯ã¢ãã¿ãªã³ã° */
|
---|
232 | /* å²è¾¼ã¿çºçæã®å¦çåä½ã®ããªã¨ã³ãã */
|
---|
233 | if (p_runisr != NULL) : // ISRã³ã³ããã¹ãã§å²è¾¼ã¿çºç
|
---|
234 | p_runisr->ssp = sp
|
---|
235 | queue_insert_next(&isr_ready_queue, p_runisr)
|
---|
236 | else if (p_runtsk != NULL) : // ã¿ã¹ã¯ã³ã³ããã¹ãã§å²è¾¼ã¿çºç
|
---|
237 | p_runtsk->ssp = sp
|
---|
238 | else : // ã¢ã¤ãã«ã³ã³ããã¹ãã§å²è¾¼ã¿çºç
|
---|
239 | saved_ostkpt = sp
|
---|
240 | /* çºçããå²è¾¼ã¿ã®ISRãèµ·å */
|
---|
241 | callevel |= TCL_ISR2
|
---|
242 | p_runisr = &isrcb_table[çºçããå²è¾¼ã¿ã«å¯¾å¿ããISR ID]
|
---|
243 | p_runosap = p_runisr->p_isrinib->p_osapcb
|
---|
244 | run_trusted = p_runosap->p_osapinib->osap_trusted
|
---|
245 | if (run_trusted) : // èµ·åããISRãä¿¡é ¼
|
---|
246 | sp = p_runisr->p_isrinib->sstk_bottom
|
---|
247 | OSå²è¾¼ã¿ç¦æ¢ã解é¤ãã
|
---|
248 | å²è¾¼ã¿ãã³ãã©ã¸ã¸ã£ã³ã
|
---|
249 | else : // èµ·åããISRãéä¿¡é ¼
|
---|
250 | p_runisrã«å¯¾å¿ããMPUè¨å®ã¨ãªãããã«æºå
|
---|
251 | sp = p_runisr->p_isrinib->ustk_bottomã¨ãªãããã«æºå
|
---|
252 | æ»ãçªå°ãexit_uisrã¨ãªãããã«æºå
|
---|
253 | OSå²è¾¼ã¿ç¦æ¢è§£é¤ç¶æ
|
---|
254 | ã¨ãªãããã«æºåãã
|
---|
255 | éç¹æ¨©ã¢ã¼ãã¨ãªãããã«æºå
|
---|
256 | å²è¾¼ã¿ãã³ãã©ã¸ã¸ã£ã³ããï¼MPUï¼spï¼æ»ãçªå°ï¼éç¹æ¨©ã¢ã¼ãè¨å®ãåæ
|
---|
257 | ------------------------------ ããã¾ã§(a) ------------------------------
|
---|
258 | ------------------------------ ãããã(b) ------------------------------
|
---|
259 | /* å²è¾¼ã¿ãã³ãã©çµäºå¾ã«ï¼ç¹æ¨©ã¢ã¼ãã§ããã«æ¥ã */
|
---|
260 | âTODO syscallãéä¿¡é ¼ã¿ã¹ã¯ãå¼ãã å ´åãèæ
|
---|
261 | ®ãã¹ãï¼p_runisrãNULLã§ãªã
|
---|
262 | ãã¨ããã§ãã¯ããã°ããï¼ï¼[protection_hookãå¼ã¶ï¼]
|
---|
263 | end_int_handler<label>:
|
---|
264 | å°ãªãã¨ãOSå²è¾¼ã¿ç¦æ¢ç¶æ
|
---|
265 | ã¨ãã
|
---|
266 | /* å²è¾¼ã¿ãã³ãã©çµäºæã®ã¹ã¿ãã¯ã¢ãã¿ãªã³ã° */
|
---|
267 | exit_isr2() // ISRã®ä¸æ£çµäºãã§ãã¯
|
---|
268 | /* å®è¡ä¸ã®å²è¾¼ã¿ãã³ãã©ãå¼·å¶çµäºãããå ´åã«ï¼ç¹æ¨©ã¢ã¼ãã§ããã«æ¥ã */
|
---|
269 | exit_and_dispatch_isr<label>:
|
---|
270 | p_runisr = NULL
|
---|
271 | if (!queue_empty(&isr_ready_queue)) : // ããªã¨ã³ãããããISRããã
|
---|
272 | p_runisr = queue_delete_next(&isr_ready_queue)
|
---|
273 | p_runosap = p_runisr->p_isrinib->p_osapcb
|
---|
274 | run_trusted = p_runosap->p_osapinib->osap_trusted
|
---|
275 | p_runisrã«å¯¾å¿ããMPUè¨å®ã¨ãªãããã«æºå
|
---|
276 | sp = p_runisr->ssp
|
---|
277 | else if (p_runtsk != NULL) : // ããªã¨ã³ãããããã¿ã¹ã¯ããã
|
---|
278 | p_runosap = p_runtsk->p_tskinib->p_osapcb
|
---|
279 | run_trusted = p_runosap->p_osapinib->osap_trusted
|
---|
280 | p_runtskã«å¯¾å¿ããMPUè¨å®ã¨ãªãããã«æºå
|
---|
281 | sp = p_runtsk->ssp
|
---|
282 | else : // ããªã¨ã³ãããããå¦çåä½ããªãï¼ã¢ã¤ãã«ã«æ»ãï¼
|
---|
283 | sp = saved_ostkpt
|
---|
284 | å²è¾¼ã¿çºçæã®callevelãspãã復帰
|
---|
285 | å²è¾¼ã¿çºçæã®å²è¾¼ã¿åªå
|
---|
286 | 度ãã¹ã¯ãspãã復帰
|
---|
287 | OSå²è¾¼ã¿ç¦æ¢ãã©ã°ããªã»ãã
|
---|
288 | if (ã¿ã¹ã¯ã³ã³ããã¹ãã«æ»ãå ´å) :
|
---|
289 | /*
|
---|
290 | * ã¢ã¤ãã«âISRâã¿ã¹ã¯ã®å ´åã¯ï¼ä¸æ¦ã¢ã¤ãã«ã«æ»ã£ã¦ãã
|
---|
291 | * ãã£ã¹ãããããã®ã§ããã«ã¯ããªã
|
---|
292 | */
|
---|
293 | ret_int_task()
|
---|
294 | ãã¹ã¦ã®æ±ç¨ã¬ã¸ã¹ã¿ãspãã復帰
|
---|
295 | if (å²è¾¼ã¿çºçæã«ã¦ã¼ã¶ã¢ã¼ã) :
|
---|
296 | if (p_runisr != NULL) : // C2ISRã³ã³ããã¹ãã§å²è¾¼ã¿çºç
|
---|
297 | sp = p_runisr->usp; // ã¦ã¼ã¶ã¹ã¿ãã¯ãã¤ã³ã¿ã®å¾©å¸°
|
---|
298 | else : // ã¿ã¹ã¯ã³ã³ããã¹ãã§å²è¾¼ã¿çºç
|
---|
299 | sp = p_runtsk->usp; // ã¦ã¼ã¶ã¹ã¿ãã¯ãã¤ã³ã¿ã®å¾©å¸°
|
---|
300 | å²è¾¼ã¿ãããªã¿ã¼ã³
|
---|
301 | ------------------------------ ããã¾ã§(b) ------------------------------
|
---|
302 | ------------------------------ ãããã(c) ------------------------------
|
---|
303 | ret_int_task<label>:
|
---|
304 | if ((p_runtsk != p_schedtsk) && ãã£ã¹ãããä¿çç¶æ
|
---|
305 | ã§ãªã<<TP>>):
|
---|
306 | OSå²è¾¼ã¿ç¦æ¢ç¶æ
|
---|
307 |
|
---|
308 | å
|
---|
309 | ¨å²è¾¼ã¿ç¦æ¢ã解é¤
|
---|
310 | /* æ±ç¨ã¬ã¸ã¹ã¿ã¯(a)ã§ä¿åæ¸ã¿ */
|
---|
311 | p_runtsk->ssp = sp
|
---|
312 | p_runtsk->pc = ret_int_r
|
---|
313 | dispatcher()
|
---|
314 | ------------------------------ ããã¾ã§(c) ------------------------------
|
---|
315 | ------------------------------ ãããã(d) ------------------------------
|
---|
316 | ret_int_r<label>:
|
---|
317 | å²è¾¼ã¿ã®åºå£å¦çã¨åãå²è¾¼ã¿ç¦æ¢ç¶æ
|
---|
318 | ã¨ãã
|
---|
319 | return;
|
---|
320 | /* returnå¾ã¯ï¼(b)ã¨åæ§ã®ã·ã¼ã±ã³ã¹ã§æ±ç¨ã¬ã¸ã¹ã¿ã復帰ãã */
|
---|
321 | ------------------------------ ããã¾ã§(d) ------------------------------
|
---|
322 |
|
---|
323 | ======================================================================
|
---|
324 | â dispatcher
|
---|
325 | æ¦è¦:
|
---|
326 | ã»ã¿ã¹ã¯åæ¿ãå®è¡ãã
|
---|
327 | ã³ã³ããã¹ãåæ¿:
|
---|
328 | ã»ã¿ã¹ã¯ â ã¿ã¹ã¯
|
---|
329 | åæ:
|
---|
330 | ã»OSå²è¾¼ã¿ç¦æ¢ç¶æ
|
---|
331 | ã§å¼ã°ãã
|
---|
332 | ã»sp == å¼åºãå
|
---|
333 | ã¿ã¹ã¯ã®ã·ã¹ãã ã¹ã¿ãã¯
|
---|
334 | ã»å¼åºãå
|
---|
335 | ã¿ã¹ã¯ã®ã¦ã¼ã¶ã¹ã¿ãã¯ãã¤ã³ã¿ã¯ï¼ã·ã¹ãã ãµã¼ãã¹
|
---|
336 | ãã®å
|
---|
337 | ¥ãå£ or å²è¾¼ã¿çºçæã«ä¿åæ¸ã¿
|
---|
338 | ã»å¼åºãå
|
---|
339 | ã¿ã¹ã¯ã®ã¬ã¸ã¹ã¿ã¯ï¼dispatch or å²è¾¼ã¿çºçæã«ä¿åæ¸ã¿
|
---|
340 | ã»callevel == TCL_TASK | TSYS_NULL || TSYS_DISALLINT
|
---|
341 | ã»å²è¾¼ã¿åªå
|
---|
342 | 度ãã¹ã¯å
|
---|
343 | ¨è§£é¤ç¶æ
|
---|
344 |
|
---|
345 | ã»ãã£ã¹ãããä¿çç¶æ
|
---|
346 | ã§ãªãï¼TPã§ã®OSAPéãªã½ã¼ã¹åå¾ç¶æ
|
---|
347 | ã§ãªãï¼
|
---|
348 | ã·ã¼ã±ã³ã¹:
|
---|
349 | stack_change_and_call_func(call_posttaskhook)
|
---|
350 | exit_and_dispatch_nohook<label>:
|
---|
351 | dispatcher_0<label>:
|
---|
352 | /*å
|
---|
353 | ¨å²è¾¼ã¿ç¦æ¢(TSYS_DISALLINT)解é¤*/
|
---|
354 | callevel ~= TSYS_DISALLINT â callevel = TCL_TASKã§ããã®ã§ã¯ï¼â
|
---|
355 | å
|
---|
356 | ¨å²è¾¼ã¿ç¦æ¢ã解é¤
|
---|
357 | dispatcher_1<label>:
|
---|
358 | p_runtsk = p_schedtsk
|
---|
359 | if (p_runtsk == NULL) :
|
---|
360 | /*ã¢ã¤ãã«*/
|
---|
361 | sp = _ostkpt
|
---|
362 | OSå²è¾¼ã¿ç¦æ¢ã解é¤
|
---|
363 | /* ããã§å²è¾¼ã¿ãåãä»ãã */
|
---|
364 | /* ã¹ãªã¼ãã¢ã¼ãã«ãããªã© */
|
---|
365 | OSå²è¾¼ã¿ç¦æ¢
|
---|
366 | dispatcher_1()
|
---|
367 | p_runosap = p_runtsk->p_tskinib->p_osapcb
|
---|
368 | run_trusted = p_runosap->p_osapinib->osap_trusted
|
---|
369 | p_runtskã«å¯¾å¿ããMPUè¨å®ã¨ãªãããã«æºå
|
---|
370 | sp = p_runtsk->sp
|
---|
371 | stack_change_and_call_func(call_pretaskhook)
|
---|
372 | pc = p_runtsk->pc
|
---|
373 |
|
---|
374 | ======================================================================
|
---|
375 | â stack_change_and_call_func(func, arg1, arg2, ...)
|
---|
376 | æ¦è¦:
|
---|
377 | ã»ããã¯ã«ã¼ãã³å¼åºãã®åºå
|
---|
378 | ¥å£
|
---|
379 | ã»call_pretaskhook
|
---|
380 | ã»call_posttaskhook
|
---|
381 | ã»call_errorhook
|
---|
382 | ã»call_protectionhk_main
|
---|
383 | ã³ã³ããã¹ãåæ¿(a):
|
---|
384 | ã»ã¿ã¹ã¯ â ããã¯ã«ã¼ãã³
|
---|
385 | ã»ISR â ããã¯ã«ã¼ãã³
|
---|
386 | ã»ããã¯ã«ã¼ãã³ â ããã¯ã«ã¼ãã³
|
---|
387 | ã³ã³ããã¹ãåæ¿(b):
|
---|
388 | ã»ããã¯ã«ã¼ãã³ â ã¿ã¹ã¯ï¼é常çµäºï¼
|
---|
389 | ã»ããã¯ã«ã¼ãã³ â ISRï¼é常çµäºï¼
|
---|
390 | ã»ããã¯ã«ã¼ãã³ â ããã¯ã«ã¼ãã³ï¼é常çµäºï¼
|
---|
391 | ã³ã³ããã¹ãåæ¿(c):
|
---|
392 | ã»ããã¯ã«ã¼ãã³ â ã¿ã¹ã¯ï¼ã¿ã¹ã¯/C2ISRå¼·å¶çµäºï¼
|
---|
393 | ã»ããã¯ã«ã¼ãã³ â C2ISRï¼C2ISRå¼·å¶çµäºï¼
|
---|
394 | ã»ããã¯ã«ã¼ãã³ â ã¢ã¤ãã«ï¼ã¿ã¹ã¯/C2ISRå¼·å¶çµäºï¼
|
---|
395 | åæ:
|
---|
396 | ã»OSå²è¾¼ã¿ç¦æ¢ç¶æ
|
---|
397 | ã§å¼ã°ãã
|
---|
398 | ã»sp == å¼åºãå
|
---|
399 | ã¿ã¹ã¯/ISRã®ã·ã¹ãã ã¹ã¿ãã¯
|
---|
400 | ã»å¼åºãå
|
---|
401 | ã¿ã¹ã¯ã®ã¦ã¼ã¶ã¹ã¿ãã¯ãã¤ã³ã¿ã¯ï¼ã·ã¹ãã ãµã¼ãã¹
|
---|
402 | ãã®å
|
---|
403 | ¥ãå£ or å²è¾¼ã¿çºçæã«ä¿åæ¸ã¿
|
---|
404 | ã»å¼åºãå
|
---|
405 | ã¿ã¹ã¯ã®ã¬ã¸ã¹ã¿ã¯ï¼dispatch or å²è¾¼ã¿çºçæã«ä¿åæ¸ã¿
|
---|
406 | ããããã¯ï¼callee-savedã§ããã°ï¼å¼ã³åºãå
|
---|
407 | ã³ã³ããã¹ãã§ä¿åï¼å¾©å¸°
|
---|
408 | ãããã
|
---|
409 | ã·ã¼ã±ã³ã¹:
|
---|
410 | ------------------------------ ãããã(a) ------------------------------
|
---|
411 | caller-savedã¬ã¸ã¹ã¿ãä¿å
|
---|
412 | if (callevel & ~(TCL_TASK | TCL_ISR2 | TSYSMASK) == 0U): /*TASK or ISR2*/
|
---|
413 | if (saved_ostkpt != NULL): /*ã¢ã¤ãã«ã«ã¼ãã§ã¹ã¿ãã¯ä½¿ç¨ä¸*/
|
---|
414 | *(saved_ostkpt - 1) = sp
|
---|
415 | sp = saved_ostkpt - 1
|
---|
416 | else:
|
---|
417 | *(_ostkpt - 1) = sp
|
---|
418 | sp = _ostkpt - 1
|
---|
419 | func(arg1, arg2, ...)
|
---|
420 | ------------------------------ ããã¾ã§(a) ------------------------------
|
---|
421 | ------------------------------ ãããã(b) ------------------------------
|
---|
422 | if (callevel & ~(TCL_TASK | TCL_ISR2 | TSYSMASK) == 0U): /*TASK or ISR2*/
|
---|
423 | sp = *(sp+1)
|
---|
424 | caller-savedã¬ã¸ã¹ã¿ã復帰
|
---|
425 | return;
|
---|
426 | ------------------------------ ããã¾ã§(b) ------------------------------
|
---|
427 | ------------------------------ ãããã(c) ------------------------------
|
---|
428 | /*
|
---|
429 | * OSAP/ã¿ã¹ã¯/ISRã®å¼·å¶çµäºãã§ããã®ã¯ï¼å段ã®ããã¯ã«ã¼ãã³ã®ã¿ï¼å®è¡
|
---|
430 | * ä¸ã®OSAP/ã¿ã¹ã¯/ISRãå¼·å¶çµäºããã¨ãã ãã§ãã
|
---|
431 | * - ãããã¯ã·ã§ã³ããã¯ããã®å¼·å¶çµäºï¼ããã¯ã«ã¼ãã³ã®å¼åºãå
|
---|
432 | ãã¦ã¼ã¶
|
---|
433 | * ã¢ã¼ãã®ã¿OSAP/ã¿ã¹ã¯/ISRã®å¼·å¶çµäºãå¯è½ã§ãããã
|
---|
434 | * - ã¨ã©ã¼ããã¯ããã®å¼·å¶çµäºï¼ããã¯ã«ã¼ãã³ããã¹ããã¦ããå ´åï¼
|
---|
435 | * ãã¹ãå
|
---|
436 | ã®å¼åºãå¶éã«ããï¼TerminateApplicationãå¼ã¹ãªã
|
---|
437 | * ï¼ã¨ã©ã¼ããã¯ãå¤éã«å¼ã°ãããã¨ã¯ãªãï¼
|
---|
438 | * 以ä¸ã®çç±ããï¼force_term_osapã§ï¼
|
---|
439 | * - exit_and_dispatch_nohook
|
---|
440 | * - isr_dispatcher
|
---|
441 | * ã«ã¸ã£ã³ãããã°ãã
|
---|
442 | */
|
---|
443 | ------------------------------ ããã¾ã§(c) ------------------------------
|
---|
444 |
|
---|
445 | ======================================================================
|
---|
446 | â ä¾å¤ã®åºå
|
---|
447 | ¥å£
|
---|
448 | æ¦è¦:
|
---|
449 | ã»ãããã¯ã·ã§ã³ããã¯å¼åºãã®åºå
|
---|
450 | ¥å£
|
---|
451 | ã³ã³ããã¹ãåæ¿(a):
|
---|
452 | ã»ã¿ã¹ã¯ â ããã¯ã«ã¼ãã³
|
---|
453 | ã»ISR â ããã¯ã«ã¼ãã³
|
---|
454 | ã»ããã¯ã«ã¼ãã³ â ããã¯ã«ã¼ãã³
|
---|
455 | ã»ã¢ã¤ãã« â ããã¯ã«ã¼ãã³
|
---|
456 | ã³ã³ããã¹ãåæ¿(b):
|
---|
457 | ã»ããã¯ã«ã¼ãã³ â ã¿ã¹ã¯ï¼é常çµäºï¼
|
---|
458 | ã»ããã¯ã«ã¼ãã³ â ISRï¼é常çµäºï¼
|
---|
459 | ã»ããã¯ã«ã¼ãã³ â ããã¯ã«ã¼ãã³ï¼é常çµäºï¼
|
---|
460 | ã³ã³ããã¹ãåæ¿(c):
|
---|
461 | ã»ããã¯ã«ã¼ãã³ â ã¿ã¹ã¯ï¼ã¿ã¹ã¯/C2ISRå¼·å¶çµäºï¼
|
---|
462 | ã»ããã¯ã«ã¼ãã³ â C2ISRï¼C2ISRå¼·å¶çµäºï¼
|
---|
463 | ã»ããã¯ã«ã¼ãã³ â ã¢ã¤ãã«ï¼ã¿ã¹ã¯/C2ISRå¼·å¶çµäºï¼
|
---|
464 | åæ:
|
---|
465 | ã·ã¼ã±ã³ã¹:
|
---|
466 | ------------------------------ ãããã(a) ------------------------------
|
---|
467 | å°ãªãã¨ãOSå²è¾¼ã¿ç¦æ¢ç¶æ
|
---|
468 | ã¨ãã
|
---|
469 | if (å²è¾¼ã¿çºçæã«ã¦ã¼ã¶ã¢ã¼ã) :
|
---|
470 | if (p_runisr != NULL) : // C2ISRã³ã³ããã¹ãã§å²è¾¼ã¿çºç
|
---|
471 | p_runisr->usp = sp; // ã¦ã¼ã¶ã¹ã¿ãã¯ãã¤ã³ã¿ã®ä¿å
|
---|
472 | sp = p_runisr->p_isrinib->sstk_bottom; // ã·ã¹ãã ã¹ã¿ãã¯ã«åæ¿ã
|
---|
473 | else : // ã¿ã¹ã¯ã³ã³ããã¹ãã§å²è¾¼ã¿çºç
|
---|
474 | p_runtsk->usp = sp; // ã¦ã¼ã¶ã¹ã¿ãã¯ãã¤ã³ã¿ã®ä¿å
|
---|
475 | sp = p_runtsk->p_tinib->sstk_bottom; // ã·ã¹ãã ã¹ã¿ãã¯ã«åæ¿ã
|
---|
476 | /*
|
---|
477 | * ãã®æç¹ã§ï¼spã¯ä»¥ä¸ã®ãããããæãã¦ãã
|
---|
478 | * - ã¿ã¹ã¯ã®ã·ã¹ãã ã¹ã¿ãã¯
|
---|
479 | * - ISRã®ã·ã¹ãã ã¹ã¿ãã¯
|
---|
480 | * - OSã¹ã¿ãã¯ï¼ã¢ã¤ãã«ã«ã¼ãã®ã³ã³ããã¹ãï¼
|
---|
481 | */
|
---|
482 | caller-savedã¬ã¸ã¹ã¿ãä¿å
|
---|
483 | if (callevel & ~(TCL_TASK | TCL_ISR2 | TSYSMASK) == 0U): /*TASK or ISR2*/
|
---|
484 | if (saved_ostkpt != NULL): /*ã¢ã¤ãã«ã«ã¼ãã§ã¹ã¿ãã¯ä½¿ç¨ä¸*/
|
---|
485 | *(saved_ostkpt - 1) = sp
|
---|
486 | sp = saved_ostkpt - 1
|
---|
487 | else:
|
---|
488 | *(_ostkpt - 1) = sp
|
---|
489 | sp = _ostkpt - 1
|
---|
490 | if (C1ISRå®è¡ä¸ã§ãªã):
|
---|
491 | OSå²è¾¼ã¿ç¦æ¢
|
---|
492 | if (ä¾å¤çºçæã«å
|
---|
493 | ¨å²è¾¼ã¿ç¦æ¢ã§ãªã):
|
---|
494 | å
|
---|
495 | ¨å²è¾¼ã¿ç¦æ¢è§£é¤
|
---|
496 | call_protectionhk_main(ã¨ã©ã¼ã³ã¼ã)
|
---|
497 | ------------------------------ ããã¾ã§(a) ------------------------------
|
---|
498 | ------------------------------ ãããã(b) ------------------------------
|
---|
499 | if (callevel & ~(TCL_TASK | TCL_ISR2 | TSYSMASK) == 0U): /*TASK or ISR2*/
|
---|
500 | sp = *(sp++)
|
---|
501 | caller-savedã¬ã¸ã¹ã¿ã復帰
|
---|
502 | if (å²è¾¼ã¿çºçæã«ã¦ã¼ã¶ã¢ã¼ã) :
|
---|
503 | if (p_runisr != NULL) : // C2ISRã³ã³ããã¹ãã§å²è¾¼ã¿çºç
|
---|
504 | sp = p_runisr->usp; // ã¦ã¼ã¶ã¹ã¿ãã¯ãã¤ã³ã¿ã®å¾©å¸°
|
---|
505 | else : // ã¿ã¹ã¯ã³ã³ããã¹ãã§å²è¾¼ã¿çºç
|
---|
506 | sp = p_runtsk->usp; // ã¦ã¼ã¶ã¹ã¿ãã¯ãã¤ã³ã¿ã®å¾©å¸°
|
---|
507 | return;
|
---|
508 | ------------------------------ ããã¾ã§(b) ------------------------------
|
---|
509 | ------------------------------ ãããã(c) ------------------------------
|
---|
510 | /*
|
---|
511 | * OSAP/ã¿ã¹ã¯/ISRã®å¼·å¶çµäºãã§ããã®ã¯ï¼å段ã®ããã¯ã«ã¼ãã³ã®ã¿ï¼å®è¡
|
---|
512 | * ä¸ã®OSAP/ã¿ã¹ã¯/ISRãå¼·å¶çµäºããã¨ãã ãã§ãã
|
---|
513 | * - ãããã¯ã·ã§ã³ããã¯ããã®å¼·å¶çµäºï¼ããã¯ã«ã¼ãã³ã®å¼åºãå
|
---|
514 | ãã¦ã¼ã¶
|
---|
515 | * ã¢ã¼ãã®ã¿OSAP/ã¿ã¹ã¯/ISRã®å¼·å¶çµäºãå¯è½ã§ãããã
|
---|
516 | * - ã¨ã©ã¼ããã¯ããã®å¼·å¶çµäºï¼ããã¯ã«ã¼ãã³ããã¹ããã¦ããå ´åï¼
|
---|
517 | * ãã¹ãå
|
---|
518 | ã®å¼åºãå¶éã«ããï¼TerminateApplicationãå¼ã¹ãªã
|
---|
519 | * ï¼ã¨ã©ã¼ããã¯ãå¤éã«å¼ã°ãããã¨ã¯ãªãï¼
|
---|
520 | * 以ä¸ã®çç±ããï¼force_term_osapã§ï¼
|
---|
521 | * - exit_and_dispatch_nohook
|
---|
522 | * - isr_dispatcher
|
---|
523 | * ã«ã¸ã£ã³ãããã°ãã
|
---|
524 | */
|
---|
525 | ------------------------------ ããã¾ã§(c) ------------------------------
|
---|
526 |
|
---|
527 | ======================================================================
|
---|
528 | ⯠OSAPå¼·å¶çµäºå¦çã®è¨è¨ï¼ã·ã³ã°ã«ã³ã¢ã®å ´åï¼
|
---|
529 | ======================================================================
|
---|
530 |
|
---|
531 | /*
|
---|
532 | * ãããã¯ã·ã§ã³ããã¯ã®åºå£ï¼TerminateApplicationï¼ã¨ãã«
|
---|
533 | * ããã¸æ¥ã
|
---|
534 | * ããã«æ¥ããã¹ã¯ä»¥ä¸ã®ã¨ãã
|
---|
535 | * - ã¿ã¹ã¯ â ãããã¯ã·ã§ã³ãã㯠â PRO_TERMINATE_APPL
|
---|
536 | * - ISR â ãããã¯ã·ã§ã³ãã㯠â PRO_TERMINATE_APPL
|
---|
537 | * - ã¿ã¹ã¯ â ã¨ã©ã¼ãã㯠â TerminateApplication
|
---|
538 | * - ISR â ã¨ã©ã¼ãã㯠â TerminateApplication
|
---|
539 | * - ã¿ã¹ã¯ â TerminateApplication
|
---|
540 | * - ISR â TerminateApplication
|
---|
541 | */
|
---|
542 | void
|
---|
543 | force_term_osap(OSAPCB *p_osapcb, RestartType RestartOption)
|
---|
544 | {
|
---|
545 | TCB *p_tcb;
|
---|
546 | PriorityType remove_task_pri;
|
---|
547 |
|
---|
548 | /* osap_statã®æ´æ° */
|
---|
549 | if (RestartOption == RESTART) {
|
---|
550 | p_osapcb->osap_stat = APPLICATION_RESTARTING;
|
---|
551 | if (p_osapcb->p_osapinib->p_restart_tcb->p_tinib->task == NULL) {
|
---|
552 | /* ãªã¹ã¿ã¼ãã¿ã¹ã¯ã®è¨å®ããªãã«ããããããï¼*/
|
---|
553 | /* RESTARTãªãã·ã§ã³ãè¨å®ããå ´åã¯ã·ã£ãããã¦ã³ãå®æ½ãã */
|
---|
554 | /* TerminateApplicationã®å ´åã¯ããã«æ¥ãåã«ã¯ããã¦ãã */
|
---|
555 | internal_shutdownos(E_OS_PROTECTION_FATAL);
|
---|
556 | }
|
---|
557 | }
|
---|
558 | else {
|
---|
559 | p_osapcb->osap_stat = APPLICATION_TERMINATED;
|
---|
560 | }
|
---|
561 |
|
---|
562 | /*ã¢ã©ã¼ã ã¨ã¹ã±ã¸ã¥ã¼ã«ãã¼ãã«ãåæ¢*/
|
---|
563 | force_term_osap_alarm(p_osapcb);
|
---|
564 | force_term_osap_schtbl(p_osapcb);
|
---|
565 | /*ISRãåæ¢*/
|
---|
566 | force_term_osap_isr(p_osapcb);
|
---|
567 |
|
---|
568 | p_tcb = p_osapcb->p_osapinib->p_restart_tcb;
|
---|
569 |
|
---|
570 | /* ãªã¹ã¿ã¼ãã¿ã¹ã¯ãæ¢ã«READYç¶æ
|
---|
571 | ã®å ´åã¯ã¬ãã£ãã¥ã¼ããåé¤ãã */
|
---|
572 | if (p_tcb->tstat == READY) {
|
---|
573 | /* ãªã¹ã¿ã¼ãã¿ã¹ã¯ã®çµäº */
|
---|
574 | p_tcb->actcnt = 0U;
|
---|
575 | #ifdef CFG_USE_PROTECTIONHOOK
|
---|
576 | p_tcb->calltfn = FALSE;
|
---|
577 | #endif /* CFG_USE_PROTECTIONHOOK */
|
---|
578 | /* curpriã¨inipriãç°ãªãå¤ã§ã¬ãã£ãã¥ã¼ã«ç¹ããã¦ããå ´åã¸ã®å¯¾å¿ */
|
---|
579 | remove_task_pri = p_tcb->curpri;
|
---|
580 |
|
---|
581 | /* ãªã½ã¼ã¹ç¢ºä¿ããã¾ã¾ã®å ´åï¼ãªã½ã¼ã¹è§£æ¾ */
|
---|
582 | release_taskresources(p_tcb);
|
---|
583 |
|
---|
584 | /* ã«ã¦ã³ã¿ã®ç¶æ
|
---|
585 | ãåæåãã */
|
---|
586 | cancel_taskcounters(p_tcb);
|
---|
587 |
|
---|
588 | /* 対象ã¿ã¹ã¯ãSUSPENDç¶æ
|
---|
589 | ã¨ãï¼ã¬ãã£ãã¥ã¼ããåé¤ãã */
|
---|
590 | p_tcb->tstat = SUSPENDED;
|
---|
591 | if (p_tcb != p_schedtsk) {
|
---|
592 | remove_task_from_queue(p_tcb, remove_task_pri);
|
---|
593 | /* p_schedtskããã¥ã¼ã®å
|
---|
594 | é ã«éé¿ */
|
---|
595 | move_schedtsk();
|
---|
596 | }
|
---|
597 | }
|
---|
598 | else if (p_schedtsk != NULL) {
|
---|
599 | /* p_schedtskãNULLã§ãªããã°ï¼ãã¥ã¼ã®å
|
---|
600 | é ã«éé¿ */
|
---|
601 | move_schedtsk();
|
---|
602 | }
|
---|
603 | else {
|
---|
604 | /* p_schedtskãNULLã®å ´åã¯ä½ãããªã */
|
---|
605 | }
|
---|
606 |
|
---|
607 | /* ãªã¹ã¿ã¼ãã¿ã¹ã¯ã®pcã«force_term_osap_mainã®ã¢ãã¬ã¹ãæ ¼ç´ */
|
---|
608 | activate_force_term_osap_main(p_tcb);
|
---|
609 |
|
---|
610 | /* curpriãæé«åªå
|
---|
611 | 度ã«å¤æ´ */
|
---|
612 | p_tcb->curpri = TPRI_MAXTASK;
|
---|
613 |
|
---|
614 | /* p_schedtskã«p_restart_tcbãæ ¼ç´ */
|
---|
615 | p_schedtsk = p_tcb;
|
---|
616 |
|
---|
617 | if (p_osapcb != p_runosap) {
|
---|
618 | /* ä»ã®OSAPãçµäº/åèµ·åããå ´å */
|
---|
619 | if ((callevel_stat & TCL_ISR2) != TCL_NULL) {
|
---|
620 | /* C2ISRããå¼ã³åºãããå ´åã¯,C2ISRã®åºå£å¦ç㧠*/
|
---|
621 | /* ãã£ã¹ããããè¡ãããï¼ããã§ã¯å®æ½ããªã */
|
---|
622 | }
|
---|
623 | else {
|
---|
624 | /*ã¿ã¹ã¯ããå¼ã³åºãããå ´åã¯ãªã¹ã¿ã¼ãã¿ã¹ã¯ã«ãã£ã¹ããã*/
|
---|
625 | dispatch();
|
---|
626 | }
|
---|
627 | }
|
---|
628 | else {
|
---|
629 | /* èªOSAPãçµäº/åèµ·åããå ´åã¯,å¼ã³åºãå
|
---|
630 | ã«æ»ããªã */
|
---|
631 | if (p_runisr != NULL) {
|
---|
632 | /* ISRã®å²è¾¼ã¿ç¦æ¢ãè§£é¤ */
|
---|
633 | /* OSå²è¾¼ã¿ç¦æ¢ãã©ã°ã¯ï¼å²è¾¼ã¿åºå£ã§å²è¾¼ã¿åªå
|
---|
634 | 度ãã¹ã¯ã
|
---|
635 | ã åæ ãããããã«ï¼å²è¾¼ã¿åºå£ã§ä¸å¾è§£é¤ããã */
|
---|
636 | if (sus_os_cnt > 0U) {
|
---|
637 | sus_os_cnt = 0U;
|
---|
638 | }
|
---|
639 | exit_and_dispatch_isr();
|
---|
640 | }
|
---|
641 | else {
|
---|
642 | /* ã¿ã¹ã¯ã®å²è¾¼ã¿ç¦æ¢ï¼ãã©ã°ããã³ã«ã¦ã³ã¿ï¼ã¯
|
---|
643 | ãªã¹ã¿ã¼ãã¿ã¹ã¯ã§è§£é¤ */
|
---|
644 | /* TODO: ã¿ã¹ã¯ã®å²è¾¼ã¿ç¦æ¢ã«ã¦ã³ã¿ãããã§è§£é¤ãã¦ãããã */
|
---|
645 | exit_and_dispatch_nohook();
|
---|
646 | }
|
---|
647 | }
|
---|
648 | }
|
---|
649 |
|
---|
650 | void
|
---|
651 | force_term_osap_isr(OSAPCB *p_osapcb)
|
---|
652 | {
|
---|
653 | ISRType i;
|
---|
654 | ISRCB *p_isrcb
|
---|
655 | const INTINIB *p_intinib;
|
---|
656 |
|
---|
657 | /* ã¬ãã£ãã¥ã¼ã«ç¹ããã¦ããISRãå¼·å¶çµäº */
|
---|
658 | for (p_isrcb = (&isr_ready_queue)->p_next;
|
---|
659 | p_isrcb != &isr_ready_queue;
|
---|
660 | p_isrcb = p_isrcb->isr_queue.p_next) {
|
---|
661 | if (p_isrcb->p_isrinib->p_osapcb == p_osapcb) {
|
---|
662 | #ifdef CFG_USE_PROTECTIONHOOK
|
---|
663 | p_isrcb->calltfn = FALSE;
|
---|
664 | #endif /* CFG_USE_PROTECTIONHOOK */
|
---|
665 | /* ãªã½ã¼ã¹ç¢ºä¿ããã¾ã¾ã®å ´åï¼ãªã½ã¼ã¹è§£æ¾ */
|
---|
666 | release_isrresources(p_isrcb);
|
---|
667 | /* ã«ã¦ã³ã¿ã®ç¶æ
|
---|
668 | ãåæåãã */
|
---|
669 | cancel_isrcounters(p_isrcb);
|
---|
670 | /*ã¬ãã£ãã¥ã¼ããé¤å¤*/
|
---|
671 | queue_delete(p_isrcb);
|
---|
672 | }
|
---|
673 | }
|
---|
674 |
|
---|
675 | if (p_runisr != NULL && p_runisr->p_isrinib->p_osapcb == p_osapcb) {
|
---|
676 | #ifdef CFG_USE_PROTECTIONHOOK
|
---|
677 | p_isrcb->calltfn = FALSE;
|
---|
678 | #endif /* CFG_USE_PROTECTIONHOOK */
|
---|
679 | /* ãªã½ã¼ã¹ç¢ºä¿ããã¾ã¾ã®å ´åï¼ãªã½ã¼ã¹è§£æ¾ */
|
---|
680 | release_isrresources(p_isrcb);
|
---|
681 | /* ã«ã¦ã³ã¿ã®ç¶æ
|
---|
682 | ãåæåãã */
|
---|
683 | cancel_isrcounters(p_isrcb);
|
---|
684 | }
|
---|
685 |
|
---|
686 | for (i = 0U; i < tnum_isr2; i++) {
|
---|
687 | p_isrcb = &(isrcb_table[i]);
|
---|
688 | if (p_isrcb->p_isrinib->p_osapcb == p_osapcb) {
|
---|
689 | p_intinib = &(intinib_table[i]);
|
---|
690 | x_disable_int(p_intinib->intno);
|
---|
691 | }
|
---|
692 | }
|
---|
693 | }
|
---|
694 |
|
---|
695 | ======================================================================
|
---|
696 | ⯠ISRå¼·å¶çµäºå¦çã®è¨è¨ï¼ã·ã³ã°ã«ã³ã¢ã®å ´åï¼
|
---|
697 | ======================================================================
|
---|
698 |
|
---|
699 | /*
|
---|
700 | * ãããã¯ã·ã§ã³ããã¯ã®åºå£ããããã¸æ¥ã
|
---|
701 | * ããã«æ¥ããã¹ã¯ä»¥ä¸ã®ã¨ãã
|
---|
702 | * - ISR â ãããã¯ã·ã§ã³ãã㯠â PRO_TERMINATE_TASKISR
|
---|
703 | */
|
---|
704 | void
|
---|
705 | force_terminate_isr(ISRCB *p_isrcb)
|
---|
706 | {
|
---|
707 | /*
|
---|
708 | * å²è¾¼ã¿ç¦æ¢ã解é¤ãã
|
---|
709 | * ã¨ã©ã¼ããã¯ãå¼ã°ãªãããï¼å¼æ°ã«OSServiceId_Invalidããã
|
---|
710 | */
|
---|
711 | release_interrupts(OSServiceId_Invalid);
|
---|
712 |
|
---|
713 | /* ãªã½ã¼ã¹ç¢ºä¿ããã¾ã¾ã®å ´åï¼ãªã½ã¼ã¹è§£æ¾ */
|
---|
714 | release_isrresources(p_isrcb);
|
---|
715 | /* ã«ã¦ã³ã¿ã®ç¶æ
|
---|
716 | ãåæåãã */
|
---|
717 | cancel_isrcounters(p_isrcb);
|
---|
718 |
|
---|
719 | exit_and_dispatch_isr();
|
---|
720 | }
|
---|
721 |
|
---|
722 | void
|
---|
723 | call_protectionhk_main(StatusType protection_error)
|
---|
724 | {
|
---|
725 | ...
|
---|
726 | pret = ProtectionHook(protection_error);
|
---|
727 | LOG_PROHOOK_LEAVE(pret);
|
---|
728 | run_trusted = saved_run_trusted;
|
---|
729 |
|
---|
730 | LEAVE_CALLEVEL(TCL_PROTECT);
|
---|
731 |
|
---|
732 | /* ä»¥ä¸ ProtectionHook å®è¡å¾ã®å¦ç */
|
---|
733 | switch (pret) {
|
---|
734 | case PRO_SHUTDOWN:
|
---|
735 | internal_shutdownos(protection_error);
|
---|
736 | break;
|
---|
737 | case PRO_TERMINATETASKISR:
|
---|
738 | if ((p_runisr != NULL) || (pre_protection_supervised == FALSE)) {
|
---|
739 | /* éä¿¡é ¼ISRã®å ´å */
|
---|
740 | force_terminate_isr(p_runisr);
|
---|
741 | }
|
---|
742 | else if ((p_runtsk != NULL) || (pre_protection_supervised == FALSE)) {
|
---|
743 | /* éä¿¡é ¼ã¿ã¹ã¯ã®å ´å */
|
---|
744 | force_terminate_task(p_runtsk);
|
---|
745 | }
|
---|
746 | else {
|
---|
747 | /* ä¿¡é ¼é åããã®ããã¯æã¯ã·ã£ãããã¦ã³ */
|
---|
748 | internal_shutdownos(E_OS_PROTECTION_FATAL);
|
---|
749 | }
|
---|
750 | break;
|
---|
751 | ...
|
---|
752 | }
|
---|
753 | ...
|
---|
754 | }
|
---|
755 |
|
---|
756 | ======================================================================
|
---|
757 | ⯠ISRåèµ·åã®è¨è¨ï¼ã·ã³ã°ã«ã³ã¢ã®å ´åï¼
|
---|
758 | ======================================================================
|
---|
759 |
|
---|
760 | ã»EnableInterruptSourceã§åèµ·åæã«å²è¾¼ã¿ã復帰ãã
|
---|
761 | ã»å²è¾¼ã¿ã®å¾©å¸°ã¯ãªã¹ã¿ã¼ãã¿ã¹ã¯ï¼ã¦ã¼ã¶å®ç¾©ï¼ã«å®æ½ããã
|
---|
762 | ã»EnableInterruptSource/DisableInterruptSourceã¯ï¼ã¿ã¹ã¯ãªã©ã¨åæ§ã«ï¼
|
---|
763 | ããªã¹ã¿ã¼ãç¶æ
|
---|
764 | ã§ã¯èªèº«ã®OSAPã®ã¿ãæä½ã§ããããã«ãã
|
---|
765 | ã»ä¸è¨ã®æä½ãEnableInterruptSource/DisableInterruptSourceã«å
|
---|
766 | ¥ãã
|
---|
767 | {
|
---|
768 | x_nested_lock_os_int();
|
---|
769 | D_CHECK_ACCESS((p_osapcb->osap_stat == APPLICATION_ACCESSIBLE) ||
|
---|
770 | (p_osapcb == p_runosap));
|
---|
771 | ...
|
---|
772 | x_nested_unlock_os_int();
|
---|
773 | }
|
---|
774 |
|
---|
775 | ======================================================================
|
---|
776 | ⯠ISRãã¼ã¿æ§é ã®è¨è¨ï¼ã·ã³ã°ã«ã³ã¢ã®å ´åï¼
|
---|
777 | ======================================================================
|
---|
778 | /* ISRã¬ãã£ãã¥ã¼ */
|
---|
779 | QUEUE isr_ready_queue;
|
---|
780 | ã»interrupt_initializeå
|
---|
781 | ã§ï¼queue_initializeã«ããåæå
|
---|
782 | ã»ç¡å¹å¤ã¯queue_emptyã«ããå¤å®
|
---|
783 |
|
---|
784 | /* ISRåæåã³ã³ããã¹ããããã¯ã追å */
|
---|
785 | typedef struct isr_initialization_block {
|
---|
786 | const INTINIB *p_intinib; /* å²è¾¼ã¿è¦æ±ã©ã¤ã³åæåãããã¯ã¸ã®ãã¤ã³ã¿ */
|
---|
787 | OSAPCB *p_osapcb; /* æå±ããOSã¢ããªã±ã¼ã·ã§ã³ã®ç®¡çããã㯠*/
|
---|
788 | uint32 acsbtmp; /* ã¢ã¯ã»ã¹è¨±å¯OSã¢ããªã±ã¼ã·ã§ã³ ãããããã */
|
---|
789 | #ifdef NTC2ISR
|
---|
790 | TSKINICTXB tskinictxb; /* ã¿ã¹ã¯åæåã³ã³ããã¹ãããã㯠*/
|
---|
791 | STKMPUINFOB stkmpu; /* ã¹ã¿ãã¯ã®MPUæ
|
---|
792 | å ± */
|
---|
793 | #endif /* NTC2ISR */
|
---|
794 | } ISRINIB;
|
---|
795 |
|
---|
796 | /* ISR管çã³ã³ããã¹ããããã¯ï¼ã«ã¦ã³ã¿ãã§ã¼ã³ï¼å¼·å¶çµäºç¨ï¼ã追å */
|
---|
797 | typedef struct isr_control_block {
|
---|
798 | #ifdef NTC2ISR
|
---|
799 | QUEUE isr_queue;
|
---|
800 | #endif /* NTC2ISR */
|
---|
801 | const ISRINIB *p_isrinib;
|
---|
802 | RESCB *p_lastrescb; /* æå¾ã«ç²å¾ãããªã½ã¼ã¹ç®¡çãããã¯ã¸ã®ãã¤ã³ã¿ */
|
---|
803 | #ifdef NTC2ISR
|
---|
804 | CNTCB *p_lastcntcb; /* æå¾ã«æä½ããã«ã¦ã³ã¿ç®¡çãããã¯ã¸ã®ãã¤ã³ã¿ */
|
---|
805 | TSKCTXB tskctxb; /* ã¿ã¹ã¯ã³ã³ããã¹ãããã㯠*/
|
---|
806 | #endif /* NTC2ISR */
|
---|
807 | #ifdef CFG_USE_PROTECTIONHOOK
|
---|
808 | boolean calltfn; /* ä¿¡é ¼é¢æ°å¼ã³åºãä¸ãã©ã° */
|
---|
809 | #endif /* CFG_USE_PROTECTIONHOOK */
|
---|
810 | } ISRCB;
|
---|
811 |
|
---|
812 |
|
---|
813 | ======================================================================
|
---|
814 | ⯠tfã®è¦ä¿®æ£ç®æï¼ã·ã³ã°ã«ã³ã¢ã®å ´åï¼
|
---|
815 | ======================================================================
|
---|
816 |
|
---|
817 | ã»OsIsrãéä¿¡é ¼ã«configã§ããããã«ãã
|
---|
818 | - $IF !OSAP.TRUSTED[ISR.OSAPID[isrid]]$ ã§ãã§ãã¯ãã¦
|
---|
819 | ãããç®æãï¼$IF !OSAP.TRUSTED[ISR.OSAPID[isrid]]
|
---|
820 | ã&& EQ(ISR.CATEGORY[isrid], "CATEGORY_1")$ã¨ãã
|
---|
821 | ã»å²è¾¼ã¿ãã³ãã©é¢æ°ãæå±ããOSAPããã¢ã¯ã»ã¹ã§ããé åã«é
|
---|
822 | ç½®ããã
|
---|
823 | - GENERATE_USER_INTHDRãã¿ã¼ã²ããä¾åé¨ã§å®ç¾©ãã
|
---|
824 | ã»ISRå°ç¨ã¹ã¿ãã¯ãçæãã
|
---|
825 | ãã»ã¦ã¼ã¶ã¹ã¿ãã¯ï¼ã·ã¹ãã ã¹ã¿ãã¯
|
---|
826 | ãã»åºæ¬ã¿ã¹ã¯ã¨åæ§ã®ãã¸ãã¯ã§çæãã/*TODO*/
|
---|
827 | - ã¹ã¿ãã¯å
|
---|
828 | ±æ
|
---|
829 | ã»ã¦ã¼ã¶ã¹ã¿ãã¯ãã¡ã¢ãªãªãã¸ã§ã¯ãã¨ãã¦ç»é²ãã
|
---|
830 |
|
---|
831 | 以ä¸
|
---|
832 |
|
---|