source: rtos_arduino/trunk/asp_1.9.2/arch/arm_m_gcc/common/core_design.txt@ 136

Last change on this file since 136 was 136, checked in by ertl-honda, 8 years ago

ライブラリとOS及びベーシックなサンプルの追加.

File size: 38.3 KB
Line 
1=====================================================================
2 ARM-Mプロセッサ依存部設計メモ
3 Last Modified:2015 Nov 23 08:57:56
4=====================================================================
5
6○このドキュメントの位置づけ
7
8このドキュメントは,TOPPERS/ASPカーネルをARMvX-Mプロセッサに移植するため
9の設計メモである.
10
11
12○ARMVx-Mの仕様まとめ(FPU以外)
13
14ARMvX-Mの仕様のうち,カーネルの設計に関係する事項
15について,まずARMv7-M
16についてまとめる.ARMv6-Mは最後にARMv7-Mとの差分として説明する.
17
18●参考資料
19
20ARMv7-M Architecture Reference Manual E.b
21DDI0403E_B_armv7m_arm.pdf
22
23●レジスタ
24
25汎用レジスタはR0~R15の16種類あり,R13のみが2バンク構成(PSP,MSP)とな
26っている.R15はPC, R14はリンクレジスタ(LR)となっている.R0~R3,R12は
27スクラッチレジスタである.
28
29●コーリングコンベンション
30
31R0~R4が引数,それ以上はスタック.戻り値は,R0~R1に格納される.(ARMに
32より規定されているため,コンパイラに依存せずこのルールとなる.)
33
34●CONTROLレジスタ
35
36PSP,MSPの切り替え,PrivilageとUserモードのレジスタ.変更後は,インスト
37ラクションバッファフラッシュ命令を実行する必
38要がある(isb).CONTROLレ
39ジスタの詳細は,ARMv7-M Architecture Application Level Reference
40Manual の B1-9 を参ç…
41§ã®ã“と.
42
43●割込みベクタ
44
45ベクタテーブル型で,ベクタテーブルのアドレスは,リセット時は0x00で,
46Vector Table Offset Register(メモリマップドレジスタ) を操作すること
47で,任意のアドレスにé…
48ç½®å¯èƒ½ã§ã‚る.
49
50●優å…
51ˆåº¦
52
53値が小さい方が高優å…
54ˆåº¦ã¨ãªã‚Šï¼Œ0が最高優å…
55ˆåº¦ã¨ãªã‚‹ï¼Žä¸€æ–¹ï¼Œå¾Œè¿°ã™ã‚‹ãƒ—ロ
56セッサの割込み優å…
57ˆåº¦ã‚’設定するBASEPRIレジスタは'0'をセットすると,å…
58¨ã¦
59の割込みを許可するため,最高優å…
60ˆåº¦ã¯ï¼Œæœ‰åŠ¹ãªãƒ“ットのLSBを'1'とした値で
61ある(3bitの場合は0x20).また,割込みの優å…
62ˆåº¦ã«'0'を設定すると,
63BASEPRIレジスタでマスクできない割込みとなる.
64
65優å…
66ˆåº¦ã¯æœ€å¤§8bitであり,SoC毎に実装
67されているビット幅
68が異なる.実装
69さ
70れるビットが8bit以下の場合は,LSBから無効になる.例えば,実装
71されてい
72るビット幅
73が7bitの場合は,ビット0が無効となる.
74
75優å…
76ˆåº¦ã®ãƒ“ットフィールドのLSBから数ビットをサブ優å…
77ˆåº¦ã¨å‘¼ã¶ãƒ•ã‚£ãƒ¼ãƒ«ãƒ‰
78に設定することが可能である.残りの上位ビットをプリエンプション優å…
79ˆåº¦ã¨
80呼ぶ.プリエンプション優å…
81ˆåº¦ãŒåŒã˜ã§ï¼Œã‚µãƒ–優å…
82ˆåº¦ãŒç•°ãªã‚‹å„ªå…
83ˆåº¦ã®ã‚°ãƒ«ãƒ¼
84プは,お互いをプリエンプトすることができない.
85
86Reset,NMI,Hard Fault 以外の例外は割込みと同様に優å…
87ˆåº¦ãŒè¨­å®šå¯èƒ½ã§ã‚り,
88割込みマスク機能により,発生を禁止することが可能である.
89
90
91●CPUモード
92
93プロセッサは,ThreadモードもしくはHandlerモードのいずれかのモードとな
94る.
95
96●リセット時の状æ…
97‹
98
99リセット時はThreadモード,MSPが有効となっている.
100
101●Handlerモード
102
103例外/割込みを受け付けると遷移するモード.受け付けた例外/割込みの例外番
104号が,IPSRにセットされる.例外番号は,TRMで定められている番号である.
105
106 例外 例外番号
107 Reset 1
108 Non-makable Interrupt 2
109 Hard Fault 3
110 Memory Management 4
111 Bus Fault 5
112 Usage Fault 6
113 SVCall 11
114 Debug Monitor 12
115 PendSV 14
116 SysTick 15
117 IRQ0 16
118 IRQ1 17
119 ..
120
121例外/割込みを受け付けると,受け付けた例外/割込みの優å…
122ˆåº¦ä»¥ä¸‹ã®ä¾‹å¤–/割
123込みを禁止する.この優å…
124ˆåº¦ãƒžã‚¹ã‚¯ã‚’"NVIC優å…
125ˆåº¦ãƒžã‚¹ã‚¯"と呼ぶ.この優å…
126ˆåº¦
127は,ソフトウェアから変更することができず,例外/割込みのリターンにより
128割込み前の値に自動的に戻る.
129
130●スタックポインタ(PSPとMSP)
131
132スタックポインタは,PSPとMSPがあり,排他的に使用可能である.Handlerモ
133ードではMSPのみ使用可能であり,ThreadモードではCONTROLレジスタで選択可
134能である.CONTROLレジスタの1ビット目をセットするとPSPが有効に,クリア
135すると,MSPが有効になる.
136
137●ThreadモードとHandlerモードの遷移
138
139ThreadモードからHandlerモードへの遷移は,例外/割込みを受け付けることで
140発生する.一方,HandlerモードからThreadモードへの遷移は,PCに
141EXC_RETURN(0xfffffffx)の値を設定することにより行う(例外リターン処理と
142呼ぶ).EXC_RETURNの下位4bitにより,遷移å…
143ˆã®ãƒ¢ãƒ¼ãƒ‰ã‚„使用するスタックポ
144インタを変更可能である.例外リターンにより,PRIMASKやBASEPRIの値は変化
145しない.一方,FAULTMASKの値は'0'にクリアさせる.
146
147●EXC_RETURN
148
149例外/割込み受付け時にlrに設定される値.ビット31~4ビットはå…
150¨ã¦'1'で,
151下位4bitは,受付け時のCPUモードやスタックを反映した値となっている.
152
153 0b0001 : Handlerモード
154 0b1001 : Threadモード with MSP
155 0b1101 : Threadモード with PSP
156
157●ThreadモードとHandlerモードの判定
158
159現状のモードを判定するには,IPSRを見て,'0'ならThreadモード,それ以外
160なら,Handlerモードとなる.
161
162●BASEPRIレジスタ
163
164設定した優å…
165ˆåº¦ä»¥ä¸‹ã®å„ªå…
166ˆåº¦ã®å‰²è¾¼ã¿ã®å—付を禁止する.この優å…
167ˆåº¦ãƒžã‚¹ã‚¯ã‚’
168"BASEPRI優å…
169ˆåº¦ãƒžã‚¹ã‚¯"と呼ぶ.'0'を設定すると,å…
170¨ã¦ã®å‰²è¾¼ã¿ã‚’許可する.
171例外/割込みの受付とリターンにより変化しない.例外/割込みに対する割込み
172優å…
173ˆåº¦ãƒžã‚¹ã‚¯ã¯ï¼ŒNVIC優å…
174ˆåº¦ãƒžã‚¹ã‚¯ã¨BASEPRIの設定値の高い方(値が小さい
175方)となる.
176
177●FAULTMASK
178
179FAULTMASKは'1'をセットすることにより,NMI以外のå…
180¨ã¦ã®å‰²è¾¼ã¿ã‚’禁止する.
181FAULTMASKは,例外のリターン処理により'0'にクリアさせる.
182
183●PRIMASKとWFI
184
185PRIMASKを'1'に設定すると,NMI と Hardware Fault 以外の例外/割込みを禁
186止する.PRIMASKは割込みの許可と割込み待
187ちをアトミックに行うために用い
188る.å…
189·ä½“的には,PRIMASKがセットされている状æ…
190‹ã§wfiを実行すると,割り込
191み待
192ちとなり,割込み受付けるとハンドラを実行せずに,wfiからリターンし
193てくる.
194
195●例外/割込みの受付
196
197・例外/割込みを受付けると,受付け時にアクティブなスタック上に以下のコ
198 ンテキストを保存する(例外フレームと呼ぶ).
199
200 -----------
201 | R0 | <- new SP
202 -----------
203 | R1 |
204 -----------
205 | R2 |
206 -----------
207 | R3 |
208 -----------
209 | R12 |
210 -----------
211 | LR |
212 -----------
213 | PC |
214 -----------
215 | xPSR |
216 -----------
217 | | <- old SP
218
219・プロセッサをHandlerモードとする.MSPが有効となる.
220・受付けた例外/割込みの例外番号をIPSRに設定する.
221・NVIC割込み優å…
222ˆåº¦ãƒžã‚¹ã‚¯ã‚’受付けた例外/割込みの優å…
223ˆåº¦ã«è¨­å®šã™ã‚‹ï¼Ž
224・lrにEXC_RETURNの値が設定される.
225・ベクタテーブルを読み込みハンドラを実行する.
226・スタックフレームは,Configureation and Control Register(CCR)の
227 STKALIGNが'1'の場合は,8byte境界にアラインされる.
228
229●例外/割込みからのリターン
230
231pcにEXC_RETURNの値を設定することにより,例外/割込みからリターンする.
232pcへの設定に使用可能な命令には制限があり,以下命令が使用可能である.
233
234 ・POP/LDM, LDR, BX
235
236●未解決課題
237
238・ベクターテーブルに登録する関数のアドレスのLSBは'1'にするべきか?
239・NVICは例外・割込みのネスト回数を内
240部的に管理しているらしい.
241 (!リファレンスを明らかに).
242 ソフトウェアでは,ネストの帳尻を合わせれば,リターンスタックを偽造し
243 ても問題ないか.
244
245●stmfdの制限
246
247stmfdはレジスタリストが1個の場合の動作は不定となっている.そのため,レ
248ジスタリストが1個の記述をアセンブラにした場合は,アセンブラがstr.w に
249変換するが,アセンブラによってはワーニングを出すため,レジスタリストが
2501個の場合は,str.wを使用する.
251
252なお,ldmfdにはこの制限がない.
253
254●ARMv6-M
255
256カーネルの設計に対して,ARMv6-MのARMv7-Mに対する差分は次の通りである.
257
258・BASEPRIレジスタ
259 ARMv6-MではBASEPRIレジスタを持たない.
260
261・FAULTMASK
262 ARMv6-MではFAULTMASKレジスタを持たない.
263
264・命令
265 一部命令が使用出来ない.
266 同じ命令でも指定可能なレジスタに制限がある
267
268・外部割込み数
269 最大32個
270
271
272○FPU関連の仕様
273
274●参考資料
275
276ARMv7-M Architecture Reference Manual E.b
277DDI0403E_B_armv7m_arm.pdf
278
279ARM CortexR-M4 Processor Technical Reference Manual Revision: r0p1
280arm_cortexm4_processor_trm_100166_0001_00_en.pdf
281
282Cortex-M4(F) Lazy Stacking and Context Switching Application Note 298
283DAI0298A_cortex_m4f_lazy_stacking_and_context_switching.pdf
284
285●概要
286
287Cortex-M4はARMv7E-Mをベースとしている.FPUサポートした実装
288とサポートし
289ていない実装
290がある.FPUをサポートした実装
291をCortex-M4Fと呼ぶ.
292在する.
293
294FPUはARMv7E-M Floatng Point Extension(FPv4-SP)をサポートしている.
295
296FPv4-SPは次の仕様となっている.
297
298レジスタ : 単精度レジスタ S0~S32 / 倍精度レジスタ D0~D15
299 D0は(S0とS1)と等価.
300命令 : 単精度命令をサポート
301
302●制御レジスタ
303
304FPSCR : Floating-point Status and Control Register
305・FPUのステータスとコントロールフィールドを持つ
306
307CPACR : Coprocessor Access Control Register
308・FPUを有効にする場合にセットする必
309要がある
310
311FPCCR : Floating-point Context Control Register
312・FPU関連のコンテキストの保存方法を選択可能
313
314FPCAR : Floating Point Context Address Register
315・例外フレームのFPUレジスタの保存アドレス(S0のアドレス)を保持.
316
317FPDSCR : Floating-point Default Status Control Register
318・FPSCRのディフォルト値を保存
319・FPUを初めて使用した場合に[26:22]がFPSCRにコピーされる.
320
321CONTROLの拡張
322・.FPCA(Bit[2])
323 ・FPUを使用すると'1'にセットされる.
324
325EXC_RETURNの拡張
326
327EXC_RETURN[4]
328 '0' : FPUの領域あり(保存されているかは別の制御)
329 S0~S15とFPSCRのための領域.
330 '1' : FPUの領域なし
331
332●ABI
333
334S0~S15,FPSCR : caller saved registers
335S16~S17 : callee saved registers
336
337●例外・割込み発生時の振る舞い
338
339詳細は ARMv7-M Architecture Reference Manual E.bの B1.5.6 Exception
340entry behavior と B1.5.8 Exception return behavior を参ç…
341§ã®ã“と.
342
343コンテキストの保存パターン
344 FPCCR
345 LSPEN ASPEN 名称(本ドキュメントオリジナル)
346 0 0 : NoAutomatic
347 0 1 : DisableLazystacking
348 1 1 : Lazystacking
349
350NoAutomatic
351・自動保存なし
352
353DisableLazystacking
354・自動保存あり.Lazystackingしない.
355・FPUを使用すると CONTROL.FPCA に'1'がセットされる.
356・CONTROL.FPCA == 1の場合に例外/割込みが発生するとFPUコンテキストをス
357 タックに保存する.
358
359Lazystacking
360・自動保存あり.Lazystacking を行う.
361・FPUを使用すると CONTROL.FPCA に'1'がセットされる.
362・CONTROL.FPCA == '1'の場合に例外/割込みが発生するとFPUコンテキストの保
363 存用の領域のみ確保され,FPCCR.LSPACT に'1'に設定される.
364・FPCCR.LSPACT == '1' の場合にFPU命令を使用するとFPUのコンテキストが保
365 存領域に保存される.
366
367FPUに関する例外/割込みのå…
368¥ã‚Šå£å‡¦ç†
369
370・DisableLazystacking or Lazystacking の場合
371 ・CONTROL.FPCA == 1の場合
372 ・例外フレームにFPUレジスタ保存用の領域を確保
373 ・DisableLazystacking の場合
374 ・FPUレジスタ保存用の領域にFPUレジスタ(S0~S15,FPSCR)を保存
375 ・Lazystacking
376 ・FPCAR に例外フレームのFPUレジスタの保存アドレス(S0のアドレス)を保持.
377 ・FPCCR.LSPACT を1に.
378・CONTROL.FPCAを0にクリア
379
380FPUに関する例外/割込みの出口処理
381
382・EXC_RETURNの4ビット目が'0'の場合(戻りå…
383ˆã§FPUを使用していた)
384 ・FPCCR.LSPACT == '1'の場合(割込みハンドラでFPUを使用しなかった)
385 ・FPCCR.LSPACTを'0'に
386 ・FPCCR.LSPACT == '0'の場合(割込みハンドラでFPUを使用した)
387 ・S0~S32とFPSCRを例外フレームから戻す
388・EXC_RETURNの4ビット目の否定をCONTROL.FPCAに設定
389 ・実質,戻りå…
390ˆã®CONTROL.FPCAを復帰
391
392ISRでのFPUの振る舞い
393
394FPCCR.LSPACT==1時(Lazystackingの時にのみ発生)にFPU命令を使用した場合
395・FPCARのアドレスにFPUレジスタ(S0~S15,FPSCR)を保存
396・FPCCR.LSPACT を0にする.
397
398○OSの実装
399
400
4011.ターゲット名
402
403 1-1 cm3(Cortex-M3)
404 1-2 armv7m(ARMv7-M)
405 1-3 arm_m
406
407cm3では,ARMv6-Mをサポートする場合に問題となる.armv7mでは,armv8mがリ
408リースされた場合に問題となる.ARM依存部はJSPでは,armv4となっていたが,
409armv5やarmv7も動作するためASPでは単にarmとした.そのため,arm_mが無難
410と考えられる.
411
412
4132.ThreadモードとHandlerモードの使い分け
414
415 2-1
416 タスクコンテキストはThreadモード,非タスクコンテキストはHandlerモー
417 ドで動作させる.
418
419 2-2
420 タスクコンテキストと非タスクコンテキストå…
421±ã«Handlerモードで動作させ
422 る.
423
424プロセッサの設計方針を考æ…
425®ã™ã‚‹ã¨2-1が有力.2-1での問題点としては,割込
426みハンドラからタスクへのリターン時にモードの変更が以下の様に多発するこ
427とが挙げられる.
428
4291.割込みハンドラ : Handlerモード
4302.タスク例外ハンドラの呼び出し : Threadモード
4313.タスクへのリターン処理 : Handlerモード
4324.タスクの再開 : Threadモード
433
4343でHandlerモードに移行する必
435要があるのは,例外フレームを用いて復帰する
436には,Handlerモードで例外リターン処理を行う必
437要があるためである.ARMで
438は,複数レジスタのロードとCPSRの復帰を同時に行えるが,M3は行えないため,
439この方法で割込みå…
440ˆã®ã‚¿ã‚¹ã‚¯ã«ãƒªã‚¿ãƒ¼ãƒ³ã™ã‚‹å¿…
441要がある.
442
4432-2の場合の割込みハンドラからタスクへのリターン時にモードの変更を以下
444に示す.また,2-2では割込み優å…
445ˆåº¦ã®æœ€ä½Žå€¤ã‚’タスクの実行時の優å…
446ˆåº¦ã¨ã—
447てリザーブする必
448要がある.
449
4501.割込みハンドラ : Handlerモード
4512.NVIC優å…
452ˆåº¦ãƒžã‚¹ã‚¯'0'を0へ : Threadモード
4533.最低優å…
454ˆåº¦ã®Handlerモードへ : Handlerモード
4554.タスク例外ハンドラの呼び出し : Handlerモード
4565.タスクへのリターンの前処理 : Threadモード
4573.タスクへのリターン : Handlerモード
4584.タスクの再開 : Handlerモード
459
460割込みハンドラからタスクのリターンに関しては,2-2であっても,2を実行す
461る場合に,NVIC優å…
462ˆåº¦ãƒžã‚¹ã‚¯ã‚’'0'にするため,例外リターン処理を行う必
463要
464がある.また,NVIC自体が,割込みのネスト回数を管理しているため,3から4
465への遷移のために,いったん例外/割込みを受付けた状æ…
466‹ã«ã™ã‚‹å¿…
467要があるた
468め,結果的に2-1以上の遷移が必
469要となる.
470
4712-2の場合は,MSPしか使えないため,割込みのå…
472¥ã‚Šå£ã§ãƒã‚¹ãƒˆå›žæ•°ã‚’判断して,
473スタックをå…
474¥ã‚Œæ›¿ãˆã‚‹å¿…
475要がある.
476
477HRP等でメモリ保護を用いる場合は2-1となる.
478
479以上の理由により,2-1を採用する.ただし2-1は,カーネル起動時とIDLEルー
480プの扱いを検討する必
481要がある.これらについては別途議論する.
482
483
4843.ディスパッチャの実行モード
485
486 3-1
487 Threadモードで実行する
488
489 3-2
490 Handlerモードで実行する
491
492ディスパッチャをThreadモードで実行すると,割込みによりプリエンプトされ
493たタスクに戻る場合は次のようなパスになる.
494
495 1. ディスパッチャ呼び出し : Threadモード
496 2. ディスパッチャ実行 : Threadモード
497 3. タスク例外実行 : Threadモード
498 4.タスクへのリターン処理 : Handlerモード
499 5. タスクの再開 : Threadモード
500
501割込みハンドラから自らディスパッチしたタスクへリターンする場合は次のパ
502スになる.
503
504 1.割込みハンドラ : Handlerモード
505 2.ディスパッチャ実行 : Threadモード
506 3.タスク例外ハンドラの呼び出し : Threadモード
507 4.タスクへのリターン : Handlerモード
508 5.タスクの再開 : Threadモード
509
510一方,ディスパッチャをHandlerモードで実行すると,割込みによりプリエン
511プトされたタスクに戻る場合は次のようなパスになる.
512
513 1. ディスパッチャ呼び出し : Threadモード
514 2. ディスパッチャ実行 : Handlerモード
515 3. タスク例外実行 : Threadモード
516 4.タスクへのリターン : Handlerモード
517 5. タスクの再開 : Threadモード
518
519割込みハンドラの出口から自らディスパッチしたタスクへリターンする場合は
520次のパスになる.
521
522 1.割込みハンドラ : Handlerモード
523 2.ディスパッチャ実行 : Handlerモード
524 3.タスク例外ハンドラの呼び出し : Threadモード
525 4.タスクへのリターン : Handlerモード
526 5.タスクの再開 : Threadモード
527
528タスク例外ハンドラがないOSの場合は,Handlerモードで実行した方がモード
529の遷移の回数が減るが,タスク例外ハンドラがあると,Threadモードの方が遷
530移回数が減るため,Threadモードとする.
531
532メモリ保護を考æ…
533®ã™ã‚‹ã¨ï¼Œãƒ‡ã‚£ã‚¹ãƒ‘ッチャはHandlerモードで動作させた方が
534効率がよいと考えられる(SVCでハンドラを呼び出すとHandlerモードとなるた
535め).
536
537
5384.スタックの使い分け
539
540 4-1
541 タスクコンテキストをPSP, 非タスクコンテキストをMSP
542 4-2
543 タスクコンテキスト,非タスクコンテキストå…
544±ã«MSP
545
5464-2の場合,割込みのå…
547¥ã‚Šå£ã§ãƒã‚¹ãƒˆå›žæ•°ã‚’判断して,スタックをå…
548¥ã‚Œæ›¿ãˆã‚‹
549必
550要がある.2でタスクコンテキストはThreadモード,非タスクコンテキスト
551はHandlerモードで動作させるとしたため,4-1を採用すると,割込みのå…
552¥ã‚Šå£
553で自動的にスタックが切り替わる.ThreadモードでのPSPのアクセスも,
554mrs/msr命令で行えるため,4-1を採用する.
555
556
5575.コンテキストの判定
558
559 5-1
560 IPSRが'0'(Threadモード)ならタスクタスクコンテキスト,'1'(Handlerモー
561 ド)なら非タスクコンテキストとする.
562
563 5-2
564 割込みのネスト回数を保持する変数を用意.1以上で非タスクコンテキスト.
565
566 5-3
567 アクティブなスタックにより判断(MSPなら非タスクコンテキスト,PSPなら
568 タスクコンテキストとする)
569
5705-1は,ソフトウェア側でコンテキスト管理のための処理を行う必
571要がないと
572いうメリットがある.しかしながら,カーネルの起動時Threadモードであるた
573め,Handlerモードへ移行する必
574要がある.ASPカーネルでは,IDLEループ実行
575は非タスクコンテキストとして動作させる必
576要があるため,IDLEループは
577Handlerモードで動作させる必
578要がある.IDLEループはディスパッチャから呼
579び出される.3で定めたように,ディスパッチャをThreadモードで動作させる
580ため,IDLEループを呼び出す際には,Handlerモードへ遷移する必
581要がある.
582Handlerモードへの遷移は,SVC/PendSVCを用いると実現可能であるが,6の割
583込みにプリエンプトされたタスクへのリターン時のHandlerモードへの移行で
584もSVC/PendSVCの使用が必
585要となるため,SVCハンドラでは,どの目的で呼び出
586されたか判定する必
587要が出てくるため,オーバヘッドが増大する.
588
5895-2では,カーネル起動時やIDLEループ時に変数を'1'に設定すればよいことに
590なる.この場合,カーネル起動時やIDLEループ時にThreadモードで実行しても
591動作に問題がないよう,特に割込みの出å…
592¥ã‚Šå£ã®è¨­è¨ˆã‚’注意する必
593要がある.
594
595カーネル起動時に関しては,å…
596¨å‰²è¾¼ã¿ã‚’禁止しており,割込みがå…
597¥ã‚‰ãªã„ので
598特に問題はない.IDLEループ時は,ThreadモードでMSPとPSPの選択が可能であ
599ることを利用して,非タスクコンテキストのスタックであるMSPに変更する.
600例外/割込みのå…
601¥ã‚Šå£ã§ã¯ï¼Œå¤šé‡å‰²è¾¼ã¿ã§ã‚るかをEXC_RETURNのモード判定の
602ビットではなく,スタックの判定ビットで行えば問題ない.例外/割込みから
603のリターンに関しては,多重割込みの判定は,å…
604¥ã‚Šå£ã¨åŒæ§˜ã«EXC_RETURNのス
605タック判定ビットで行えばよい.例外リターン処理時にpcに代å…
606¥ã™ã‚‹
607EXC_RETURNの値を一律0xfffffffd (Threadモード with MSP)とするのではなく,
608例外/割込み受付け時にLRに設定されるEXC_RETURNを用いることにより,IDLE
609ループに割り込んだ場合でも問題なくリターンする.
610
611カーネル起動時は,MSPがアクティブであり,割込みハンドラ実行時はHandler
612モードであることからMSPがアクティブでり,IDLEループ時にMSPをアクティブ
613に設定すると,非タスクコンテキストはå…
614¨ã¦ï¼ŒMSPをアクティブにして動作す
615ることになる.また,割込み時は割込み前にアクティブなスタックの情
616報が,
617EXC_RETURNに設定される.そのため,コンテキストの判定は,割込みネスト回
618数を保持する変数がなくとも,アクティブなスタックを見ればよいことになる.
619また,exc_sense_context()に関しては,例外フレーム中にEXC_RETURNを追加
620し,その内
621容により判断すればよい.以上の理由により,5-3を採用する.
622
623
6246.割込みにプリエンプトされたタスクへのリターン時のHandlerモードへの移
625 行方法
626
627 6-1
628 SVCを用いる
629 6-2
630 PendSVCを用いる
631
632PendSVCとSVCの違いは,PendSVCが要求がキューイングされ,SVCは要求がキュ
633ーイングされないことである.割込みにプリエンプトされたタスクへのリター
634ン時のHandlerモードへの移行は,キューイングされずに即座に処理される必
635
636要があるため,どちらで実現しても問題ない.どちらをカーネルのリソースし
637て使用するかの選択だけである.
638
639どちらを使うとしても,優å…
640ˆåº¦ã®è¨­å®šãŒå•é¡Œã¨ãªã‚‹ï¼Žãƒ‡ã‚£ã‚¹ãƒ‘ッチャから割込
641みにプリエンプトされたタスクへのリターンまでの処理は,少なくともCPUロ
642ック状æ…
643‹ã§å®Ÿè¡Œã•ã‚Œãªã‘ればならない.SVCやPendSVCはどちらも割込み優å…
644ˆåº¦
645を持つため,NVIC優å…
646ˆåº¦ãƒžã‚¹ã‚¯ã‚ˆã‚ŠBASEPRI優å…
647ˆåº¦ãƒžã‚¹ã‚¯ã®æ–¹ãŒé«˜ã„場合,処
648理されない.
649
650CPUロック状æ…
651‹ã‚’BASEPRIの設定で実現した場合,その設定値をSVCやPendSVCに
652設定した値より低くする必
653要がある.言い換えると,SVCやPendSVCの優å…
654ˆåº¦ã‚’
655CPUロック時の優å…
656ˆåº¦ãƒžã‚¹ã‚¯ã®å€¤ã‚ˆã‚Šé«˜ã„値(他の割込みより高い優å…
657ˆåº¦ï¼‰ã¨
658する必
659要がある.
660
661CPUロック状æ…
662‹ã‚’FAULTMASKやPRIMASKで実現した場合は,これらが設定される
663と,SVCやPendSVCが受付けられないため,いったんBASEPRIにより割込みをマ
664スクするように設定する必
665要がある.この場合も,SVCやPendSVCは他の割込み
666より高い優å…
667ˆåº¦ã‚’設定する必
668要がある.
669
670以上により,Handlerモードへの移行のためには,CPUロック状æ…
671‹ã‚’BASEPRIで
672実現し,SVCやPendSVCに設定する優å…
673ˆåº¦ã‚’カーネル管理内
674の最高優å…
675ˆåº¦ã‚ˆã‚Šä¸€
676つ高い優å…
677ˆåº¦ã«è¨­å®šã™ã‚‹å¿…
678要がある.
679
680ARMv7-MではSVCにより実現する.SVNの方がPendSVCより実行オーバヘッドが小
681さいため,SVCを使用する
682
683ARMv6-MではSVCにより実現する.ARMv6-MはCPUロック状æ…
684‹ã‚’PRIMASKで実現し
685ているPRIMASKをセットした状æ…
686‹ã§SVCを実行するとフォールトとなるため,
687PendSVCを発行して,PRIMASKをクリアすることで実現する.PendSVCの割込み
688優å…
689ˆåº¦ã¯æœ€é«˜ã¨ã—ているため,この間で割込みがå…
690¥ã‚‹ã“とはない.
691
692
6937. 例外/割込み出å…
694¥ã‚Šå£ã§ã®å¤šé‡å‰²è¾¼ã¿ã®åˆ¤æ–­
695
6967-1
697 EXC_RETURNのモード判定ビット
6987-2
699 EXC_RETURNのスタック判定ビット
7007-3
701 割込みネスト回数の管理変数
702
703例外/割込み受付け時は,受付けた例外/割込み以下の割込みは禁止するが,å…
704¨
705割込み禁止状æ…
706‹ã«ã¯ãªã‚‰ãªã„.そのため,割込みネスト回数の管理変数をイン
707クリメントする前に割込みがå…
708¥ã‚‹å¯èƒ½æ€§ãŒã‚るため,7-3は使用することがで
709きない.
710
7115で議論した通り,IDLEループをThreadモードで実行するため,7-1ではなく,
7127-2で判断する必
713要がある.
714
715
7168. IDLEループ
717
7188-1
719 Threadモードで実行
7208-2
721 Handlerモードで実行
722
7235で議論した通り,Threadモードで実行できた方がオーバヘッドが小さい.ま
724た,Threadモードで実行しても,割り込みの出å…
725¥ã‚Šå£ã§æ­£ã—く非タスクコンテ
726キストと判定できれば,Threadモードで問題ない.
727
728
7299.カーネル管理外の割込みのサポート
730
7319-1
732 カーネル管理外の割込みをサポートしない
7339-2
734 カーネル管理外の割込みをサポートする
735
736ARMv7-Mでは,CPUロックをBASEPRIで実現していること,ベクタテーブルをサ
737ポートしており,割込みハンドラもC言語で記述可能であるため,サポートが
738容易であるため,サポートする.
739
740ARMv6-Mでは,CPUロックをPRIMASKで実現しているため,サーポートしない.
741
742
74310. CPUロック
744
74510-1
746 BASEPRIを使用(ARMv7-M)
747 個別の割込み禁止許可でエミュレーション(ARMv6-M)
74810-2
749 FAULTMASK/PRIMASKを使用
750
751カーネルの管理外の割込みをサポートするなら,BASEPRIを使用する必
752要があ
753る.
754
755ARMv7-MではCPUロックにBASEPRIを使用する.
756
757ARMv6-MではCPUロックにPRIMASKを使用する.個別の割込み禁止許可でエミュ
758レーションする方法は,SysTicのみ別のレジスタで設定する必
759要があり,実行
760オーバヘッドが大きいという問題がある.
761
76211. 割込みロックとCPU例外の関係
763
76411-1
765 BASEPRIを使用(ARMv7-M)
76611-2
767 FAULTMASK/PRIMASKを使用
768
769FAULTMASK/PRIMASKを使用すると,NMI と Hardware Fault 以外のCPU例外も禁
770止されてしまう.
771
772BASEPRIを用いると,割込みロック中にもCPU例外を受付けたい場合は,
773BASEPRIを用いて,最高優å…
774ˆåº¦ã‚’CPU例外のためにリザーブする必
775要がある.
776
777割込みロック時も,CPU例外を受付けるようにしたければBASEPRIを使用する必
778
779要がある.
780
781μIRON4.0仕様の3.5.3では,CPU例外の優å…
782ˆåº¦ã¯æ¬¡ã®ã‚ˆã†ã«å®šã‚ã‚‰ã‚Œã¦ã„る.
783
784"CPU例外ハンドラの優å…
785ˆé †ä½ã¯ï¼ŒCPU例外が発生した処理の優å…
786ˆåº¦ã¨ï¼Œãƒ‡ã‚£ã‚¹
787パッチャの優å…
788ˆé †ä½ã®ã„ずれかよりも高い."
789
790CPU例外が発生した処理の優å…
791ˆåº¦ã‚ˆã‚Šã‚‚高いとあるので,CPUロックや割込みロ
792ック状æ…
793‹ã®ã‚¿ã‚¹ã‚¯ã§ç™ºç”Ÿã—た場合でも,優å…
794ˆã—て実行されるべきだとも考えら
795れる.
796
797一方,TOPPERS標準割込み処理モデルの仕様書では,CPU例外は,プロセッサ毎
798に異なるため,CPU例外の処理モデルの標準化検討の対象外としている.その
799ため,ARM-Mでの扱いを決めて,マニュアルに明記すればよいと考えられる.
800
801ARMv7-Mでは割込みロックはBASEPRIを使用する.
802
803ARMv6-Mでは割込みロックはPRIMASKを使用する.
804
805
80612. 外部優å…
807ˆåº¦ã¨å†…
808部優å…
809ˆåº¦ã®å¤‰æ›
810
811外部優å…
812ˆåº¦ã¨ã¯APIで指定する割込み優å…
813ˆåº¦(PRI型)のことであり,値が小さい
814ほど優å…
815ˆåº¦ãŒé«˜ã„.割込みハンドラには,-1から連続した負の値を設定可能で
816ある.内
817部優å…
818ˆåº¦ã¯ï¼ŒBASEPRIやNVICの優å…
819ˆåº¦ãƒ¬ã‚¸ã‚¹ã‚¿ã«è¨­å®šã™ã‚‹å€¤ã§ã‚る.
820
821実装
822される割込み優å…
823ˆåº¦ã®ãƒ“ット幅
824を TBITW_IPRI とすると,設定可能な外部
825優å…
826ˆåº¦ã¯æ¬¡ã®ã‚ˆã†ã«ãªã‚‹ï¼Ž
827
828 TIPM_ENAALL(=0)~ -(1 << TBITW_IPRI)
829
830
83113. カーネル管理内
832の最高優å…
833ˆåº¦(CPUロック状æ…
834‹ã§ã®å„ªå…
835ˆåº¦ãƒžã‚¹ã‚¯)
836
8376.で述べたように,割込みの出口でSVCハンドラを呼び出す必
838要があるため,
839SVCハンドラはCPUロック状æ…
840‹ã®BASEPRIに設定する優å…
841ˆåº¦ãƒžã‚¹ã‚¯ã‚ˆã‚Šé«˜ã„優å…
842ˆåº¦
843を設定する必
844要がある.
845
846実装
847される割込み優å…
848ˆåº¦ã®ãƒ“ット幅
849を TBITW_IPRI,優å…
850ˆåº¦ä¸­ã®ã‚µãƒ–優å…
851ˆåº¦ã®
852ビット幅
853をTBIT_IPRIとすると,CPUロック状æ…
854‹ï¼ˆã‚«ãƒ¼ãƒãƒ«ç®¡ç†å†…
855割込みに設定
856可能な最高優å…
857ˆåº¦ï¼‰ã¨ã—て指定可能な優å…
858ˆåº¦ãƒžã‚¹ã‚¯ã®è¨­å®šç¯„囲は以下の値の範
859囲となる.
860
861 -(2^(TBIW_IPRI) - 1) + (2^TBITW_SUBIPRI) ~ -1
862
863
86414. 割込み優å…
865ˆåº¦ãƒžã‚¹ã‚¯
866
867ARMv7-MではBASEPRIにより実現する.
868
869ARMv6-Mでは個別の割込み禁止許可機能を用いてエミュレーションする.
870
871
87215. FPUのサポート
873
87415-1
875 FPUを使用するタスク/ISRをユーザが指定する. 指定していないタスク/ISR
876 ではFPUを使用すると例外となる.
87715-2
878 FPUを使用するタスク/ISRをユーザは指定しない.å…
879¨ã¦ã®ã‚¿ã‚¹ã‚¯/ISRでFPUを
880 使用可能である.
881
88215-1は一般にコンテキストの保存復帰のオーバヘッドを低減する目的で採用さ
883れる.15-1を採用すると,タスクとISRの属性の拡張が必
884要となる.
885
886ARMv7-Mでは,FPUを使用した場合のみ例外・割込みのå…
887¥ã‚Šå£ã§FPUコンテキス
888トを保存する機能があるため,15-2を選択しても,FPUを使わない限りはペナ
889ルティはないと考え,15-2を採用する.
890
891FPUに関するサポートのバリエーションは次の組み合わせが可能である.
892
893 FPCCR コンテキスト
894 LSPEN ASPEN コンパイルオプション 保存復帰 FPU
895NO_FPU - - 指定なし なし 無効
896FPU_NO_PRESERV 0 0 -mfpu=fpv4-sp-d16 なし 有効
897FPU_NO_LAZYSTACKING 0 1 -mfpu=fpv4-sp-d16 あり 有効
898FPU_LAZYSTACKING 1 1 -mfpu=fpv4-sp-d16 あり 有効
899
900NO_FPU
901FPUを使用しない.Cortex-M0/Cortex-M0+/Cortex-M3/Cortex-M4 の場合に指定.
902ディスパッチャ等ではFPUコンテキストの保存復帰を行わない.
903
904FPU_NO_PRESERV
905FPUを使用する.Cortex-M4F の場合に指定可能.
906ディスパッチャ等ではFPUコンテキストの保存復帰を行わない.
907FPUを使用可能なタスクは1個もしくは,システム中の最高優å…
908ˆåº¦ã®ISR群で使
909用可能.
910
911FPU_NO_LAZYSTACKING
912FPUを使用する.Cortex-M4F の場合に指定可能.
913ディスパッチャ等ではFPUコンテキストの保存復帰を行う.Lazy stacking は
914使用しない.
915å…
916¨ã¦ã®ã‚¿ã‚¹ã‚¯/ISRでFPUを使用可能.
917
918FPU_LAZYSTACKING
919FPUを使用する.Cortex-M4F の場合に指定可能.
920ディスパッチャ等ではFPUコンテキストの保存復帰を行う.Lazy stacking を
921使用する.
922å…
923¨ã¦ã®ã‚¿ã‚¹ã‚¯/ISRでFPUを使用可能.
924
925
926FPU_NO_LAZYSTACKING時のレジスタの保存・復帰コード
927
928FPU_NO_LAZYSTACKING の場合は一般レジスタと同じタイミングで,ディスパッ
929チå…
930ƒã®ã‚¿ã‚¹ã‚¯ãŒFPUを使用していたかを判断してレジスタを保存・復帰すれば
931よい.該当する箇所は次の通りである.
932
933ディスパッチ(dispatch)
934・CONTROL.FPCAをチェックして'1'ならs16-s31を保存する
935・復帰用にCONTROL.FPCAをタスクスタックに保存
936
937ディスパッチからの復帰(dispatch)
938・CONTROL.FPCAをタスクスタックから復帰する
939・復帰したCONTROL.FPCAをチェックして'1'ならs16-s31をタスクスタックから
940 復帰する.
941
942遅
943延ディスパッチ(ret_int_4)
944・タスクが割り込まれた際のEXC_RETURNをタスクスタックに保存しておく
945・EXC_RETURNをタスクスタックから復帰
946・復帰したEXC_RETURN[4] == 0(FPU使用)ならs16-s31をタスクスタックに保存
947 する.
948・復帰用にEXC_RETURNの値をタスクスタックに保存
949
950遅
951延ディスパッチからの復帰(ret_int_r)
952・タスクが割り込まれた際のEXC_RETURNの値をタスクスタックから復帰
953・復帰したEXC_RETURN[4] == 0(FPU使用)ならs16-s31をタスクスタックから復帰
954・å…
955ˆã®SVCハンドラ呼び出し時にFPUレジスタを積まないようにCONTROL.FPCAをクリア.
956
957FPU_LAZYSTACKING時のレジスタの保存・復帰コード
958
959FPU_NO_LAZYSTACKING時のコードをそのまま使用するとFPU_LAZYSTACKINGの場
960合は,割込み・例外発生後に次のタイミングで例外フレームにFPUのコンテキ
961ストがハードウェアによって自動的に保存される.
962
963例外・割込みハンドラ実行中
964FPUを使用したタスク/ISR実行中に例外・割込みが発生し,例外・割込みハン
965ドラでFPU命令を実行した場合.FPCCR.LSPACT==1 となっているため.
966
967遅
968延ディスパッチ時(ret_int_4)
969例外・割込みハンドラでFPUを使用しなかった場合は,ret_int_4実行時にはコ
970ンテキストは保存されていない.さらに各レジスタの値は次のようになってい
971る.
972・FPCCR.LSPACT == '1'
973・FPCAR = 例外フレームのFPUレジスタの保存アドレス(S0のアドレス)
974ret_int_4では,s16-s31 をタスクスタックに保存する.ここでFPUを使用する
975ため,s0-s15,FPSRは例外フレームに保存される.
976
977以下の箇所はFPU_LAZYSTACKINGの場合にのみ必
978要である.
979
980割込み出口でのタスク例外呼び出し時
981FPUを使用したタスク実行中に例外/割込みが発生し,例外/割込みの出口から
982タスク例外処理を呼び出した場合には,FPCCR.LSPACT == '1' とFPUコンテキ
983ストが保存されていない状æ…
984‹ã§ã‚¿ã‚¹ã‚¯ä¾‹å¤–が呼び出される可能性がある.タス
985ク例外でext_tsk()を呼び出した場合や他のタスクにディスパッチされ,
986ter_tsk()で終了させられた場合には,FPCCR.LSPACT を '0'にクリアする必
987要
988がある.ext_tsk()のケースはターゲット依存部exit_and_dispatch()が呼び出
989されるため,ここでクリアすれば良いが,ter_tsk()ではターゲット依存部を
990呼び出さないため,クリアすることが出来ない.そのため,割込み出口でのタ
991スク例外呼び出すタイミングでFPUコンテキストをスタックに格納するため,
992副作用のないFPU命令を発行する.
993なお,他のタスクにディスパッチされた場合は,CONTROL.FPCAが'1'で無いた
994め(タスク例外でFPUを使用しなかった場合),s16~s31のFPUレジスタの保存が
995行われず,例外フレームへの書き戻しが発生しない.
996
997CONTROL.FPCAのセット・クリアのタイミング
998
999クリアする箇所が複数箇所になると把握が困難であるため,ディスパッチャのå…
1000ˆé ­ã§
1001は一律CONTROL.FPCAを'0'にクリアする.
1002
1003dispatchを呼び出したタスクへのリターンする際には,戻りå…
1004ˆã®ã‚¿ã‚¹ã‚¯ãŒFPU
1005を使用しいた場合は,s16~s31の復帰を行うため,この処理により
1006CONTROL.FPCAが'1'にセットされる.
1007
1008また,EXC_RETURNによるリータン時はEXC_RETURNの値によってリーターン時に
1009ハードウェア的に自動的にCONTROL.FPCAがå…
1010ƒã®çŠ¶æ…
1011‹ã«å¾©å¸°ã•ã‚Œã‚‹ã®ã§ã‚½ãƒ•ãƒˆã‚¦
1012ェアによる処理は必
1013要ない.
1014
1015タスク例外の扱い
1016
1017タスク例外でFPUを使用して,通常の処理でFPUを使用しない場合は,タスク例
1018外の呼び出しの前後で CONTROL.FPCA を保存復帰する方法もあるが,レアケー
1019スであると考えられるためサポートしない.
1020
1021ABI
1022
1023GCCでは3種類選択可能.
1024
1025hard : 浮動小数点命令を使用してABIはFPUレジスタを使用.
1026soft : 浮動小数点命令を使用しない.
1027softfp : 浮動小数点命令を使用するがABIはsoftと同じ.
1028
1029既存のライブラリとリンクする場合はsoftfpが有効だが,ユーザーカスタマイ
1030ズとしてディフォルトは,hardとする.
1031
1032マクロ
1033
1034FPUコンテキスト復帰保存を有効化するマクロ.
1035
1036TOPPERS_FPU_CONTEXT
1037
1038FPUの使用を有効化するマクロ.
1039
1040TOPPERS_FPU_ENABLE
1041
1042FPUのアーキテクチャを指定するマクロ.ARMCCと合わせて次のマクロを使用する.
1043__TARGET_FPU_FPV4_SP
1044
1045FPU_NO_PRESERV/FPU_NO_LAZYSTACKING/FPU_LAZYSTACKINGの場合は次のマクロを定義する.
1046
1047TOPPERS_FPU_NO_PRESERV
1048
1049TOPPERS_FPU_NO_LAZYSTACKING
1050
1051TOPPERS_FPU_LAZYSTACKING
1052
1053
105416. 未解決課題
1055・割込みロックとCPU例外の関係
1056 BASEPRIを使ったとしても,あるCPU例外処理中に他の例外が発生すると,そ
1057 の例外は受け付けられないため,ITRON仕様は満たせない.
1058 ->あきらめてマニュアル記載に逃げるか.
1059 メモリプロテクションの例外もマスク可能であるため要件等.
1060
1061以上.
Note: See TracBrowser for help on using the repository browser.