source: atk2-sc3-1.4.0-ntisr/doc/ntisr_design_memo.txt

Last change on this file was 172, checked in by ertl-ishikawa, 8 years ago

ATK2-SC3 1.4.0 RH850依存部 非信頼C2ISR対応を追加

File size: 32.5 KB
RevLine 
[172]1
2 ATK2 非信頼ISR対応 設計メモ =CONFIDENTIAL=
3 対応バージョン: Release 1.4.1
4 最終更新: 2016年3月4日
5
6Copyright (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======================================================================
41TASK<<MC/TP以外>> 拡張タスク:個別のユーザスタック&システムスタック
42 基本タスク:優å…
43ˆåº¦æ¯Žã®ãƒ¦ãƒ¼ã‚¶ã‚¹ã‚¿ãƒƒã‚¯&システムスタック
44TASK<<MC>> 拡張タスク:個別のユーザスタック&システムスタック
45 基本タスク:コア毎かつ優å…
46ˆåº¦æ¯Žã®ãƒ¦ãƒ¼ã‚¶ã‚¹ã‚¿ãƒƒã‚¯&システム
47 スタック
48TASK<<TP>> 拡張タスク:個別のユーザスタック&システムスタック
49 基本タスク:ウィンドウ毎かつ優å…
50ˆåº¦æ¯Žã®ãƒ¦ãƒ¼ã‚¶ã‚¹ã‚¿ãƒƒã‚¯&
51 システムスタック
52C2ISR<<MC/TP以外>> 優å…
53ˆåº¦æ¯Žã®ãƒ¦ãƒ¼ã‚¶ã‚¹ã‚¿ãƒƒã‚¯&システムスタック
54C2ISR<<MC>> コア毎かつ優å…
55ˆåº¦æ¯Žã®ãƒ¦ãƒ¼ã‚¶ã‚¹ã‚¿ãƒƒã‚¯&システムスタック
56C2ISR<<TP>> ウィンドウ毎かつ優å…
57ˆåº¦æ¯Žã®ãƒ¦ãƒ¼ã‚¶ã‚¹ã‚¿ãƒƒã‚¯&システムスタック
58C1ISR OS管理外
59フックルーチン OSスタック
60アイドルループ OSスタック ※タスクが存在しないconfigを考æ…
61®
62OS割込み OSスタック
63main関数 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 */
542void
543force_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
650void
651force_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 */
704void
705force_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
722void
723call_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レディキュー */
779QUEUE isr_ready_queue;
780・interrupt_initialize内
781で,queue_initializeにより初期化
782・無効値はqueue_emptyにより判定
783
784/* ISR初期化コンテキストブロックを追加 */
785typedef 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管理コンテキストブロック,カウンタチェーン(強制終了用)を追加 */
797typedef 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
Note: See TracBrowser for help on using the repository browser.