source: ssp_qb_r5f100le_cs/trunk/arch/arm_m_gcc/prc_design.txt

Last change on this file was 95, checked in by nmir-saito, 9 years ago

ファイルの mime-type 変更

  • Property svn:mime-type set to text/plain; charset=shift_jis
File size: 17.6 KB
Line 
1=====================================================================
2 ARM-Mプロセッサ依存部設計メモ
3 Last Modified: 23 Aug 2008 21:54:54
4=====================================================================
5
6○このドキュメントの位置づけ
7
8このドキュメントは,TOPPERS/ASPカーネルをARMvX-Mプロセッサに移植するため
9の設計メモである.
10
11
12○ARMVx-Mの仕様まとめ
13
14ARMvX-Mの仕様のうち,カーネルの設計に関係する事項についてまとめる.
15
16●レジスタ
17
18汎用レジスタはR0〜R15の16種類あり,R13のみが2バンク構成(PSP,MSP)とな
19っている.R15はPC, R14はリンクレジスタ(LR)となっている.R0〜R3,R12は
20スクラッチレジスタである.
21
22●コーリングコンベンション
23
24R0〜R4が引数,それ以上はスタック.戻り値は,R0〜R1に格納される.(ARMに
25より規定されているため,コンパイラに依存せずこのルールとなる.)
26
27●CONTROLレジスタ
28
29PSP,MSPの切り替え,PrivilageとUserモードのレジスタ.変更後は,インスト
30ラクションバッファフラッシュ命令を実行する必要がある(isb).CONTROLレ
31ジスタの詳細は,ARMv7-M Architecture Application Level Reference
32Manual の B1-9 を参照のこと.
33
34●割込みベクタ
35
36ベクタテーブル型で,ベクタテーブルのアドレスは,リセット時は0x00で,
37Vector Table Offset Register(メモリマップドレジスタ) を操作すること
38で,任意のアドレスに配置可能である.
39
40●優先度
41
42値が小さい方が高優先度となる.
43
44優先度は最大8bitであり,SoC毎に実装されているビット幅が異なる.実装さ
45れるビットが8bit以下の場合は,LSBから無効になる.例えば,実装されてい
46るビット幅が7bitの場合は,ビット0が無効となる.
47
48優先度のビットフィールドのLSBから数ビットをサブ優先度と呼ぶフィールド
49に設定することが可能である.残りの上位ビットをプリエンプション優先度と
50呼ぶ.プリエンプション優先度が同じで,サブ優先度が異なる優先度のグルー
51プは,お互いをプリエンプトすることができない.
52
53Reset,NMI,Hard Fault 以外の例外は割込みと同様に優先度が設定可能であり,
54割込みマスク機能により,発生を禁止することが可能である.
55
56●CPUモード
57
58プロセッサは,ThreadモードもしくはHandlerモードのいずれかのモードとな
59る.
60
61●リセット時の状態
62
63リセット時はThreadモード,MSPが有効となっている.
64
65●Handlerモード
66
67例外/割込みを受け付けると遷移するモード.受け付けた例外/割込みの例外番
68号が,IPSRにセットされる.例外番号は,TRMで定められている番号である.
69
70 例外 例外番号
71 Reset 1
72 Non-makable Interrupt 2
73 Hard Fault 3
74 Memory Management 4
75 Bus Fault 5
76 Usage Fault 6
77 SVCall 11
78 Debug Monitor 12
79 PendSV 14
80 SysTick 15
81 IRQ0 16
82 IRQ1 17
83 ..
84
85例外/割込みを受け付けると,受け付けた例外/割込みの優先度以下の例外/割
86込みを禁止する.この優先度マスクを"NVIC優先度マスク"と呼ぶ.この優先度
87は,ソフトウェアから変更することができず,例外/割込みのリターンにより
88割込み前の値に自動的に戻る.
89
90●スタックポインタ(PSPとMSP)
91
92スタックポインタは,PSPとMSPがあり,排他的に使用可能である.Handlerモ
93ードではMSPのみ使用可能であり,ThreadモードではCONTROLレジスタで選択可
94能である.CONTROLレジスタの1ビット目をセットするとPSPが有効に,クリア
95すると,MSPが有効になる.
96
97●ThreadモードとHandlerモードの遷移
98
99ThreadモードからHandlerモードへの遷移は,例外/割込みを受け付けることで
100発生する.一方,HandlerモードからThreadモードへの遷移は,PCに
101EXC_RETURN(0xfffffffx)の値を設定することにより行う(例外リターン処理と
102呼ぶ).EXC_RETURNの下位4bitにより,遷移先のモードや使用するスタックポ
103インタを変更可能である.例外リターンにより,PRIMASKやBASEPRIの値は変化
104しない.一方,FAULTMASKの値は'0'にクリアさせる.
105
106●EXC_RETURN
107
108例外/割込み受付け時にlrに設定される値.ビット31〜4ビットは全て'1'で,
109下位4bitは,受付け時のCPUモードやスタックを反映した値となっている.
110
111 0b0001 : Handlerモード
112 0b1001 : Threadモード with MSP
113 0b1101 : Threadモード with PSP
114
115●ThreadモードとHandlerモードの判定
116
117現状のモードを判定するには,IPSRを見て,'0'ならThreadモード,それ以外
118なら,Handlerモードとなる.
119
120●BASEPRIレジスタ
121
122設定した優先度以下の優先度の割込みの受付を禁止する.この優先度マスクを
123"BASEPRI優先度マスク"と呼ぶ.'0'を設定すると,全ての割込みを許可する.
124例外/割込みの受付とリターンにより変化しない.例外/割込みに対する割込み
125優先度マスクは,NVIC優先度マスクとBASEPRIの設定値の高い方(値が小さい
126方)となる.
127
128●FAULTMASK
129
130FAULTMASKは'1'をセットすることにより,NMI以外の全ての割込みを禁止する.
131FAULTMASKは,例外のリターン処理により'0'にクリアさせる.
132
133●PRIMASKとWFI
134
135PRIMASKを'1'に設定すると,NMI と Hardware Fault 以外の例外/割込みを禁
136止する.PRIMASKは割込みの許可と割込み待ちをアトミックに行うために用い
137る.具体的には,PRIMASKがセットされている状態でwfiを実行すると,割り込
138み待ちとなり,割込み受付けるとハンドラを実行せずに,wfiからリターンし
139てくる.
140
141●例外/割込みの受付
142
143・例外/割込みを受付けると,受付け時にアクティブなスタック上に以下のコ
144 ンテキストを保存する(例外フレームと呼ぶ).
145
146 -----------
147 | R0 | <- new SP
148 -----------
149 | R1 |
150 -----------
151 | R2 |
152 -----------
153 | R3 |
154 -----------
155 | R12 |
156 -----------
157 | LR |
158 -----------
159 | PC |
160 -----------
161 | xPSR |
162 -----------
163 | | <- old SP
164
165・プロセッサをHandlerモードとする.MSPが有効となる.
166・受付けた例外/割込みの例外番号をIPSRに設定する.
167・NVIC割込み優先度マスクを受付けた例外/割込みの優先度に設定する.
168・lrにEXC_RETURNの値が設定される.
169・ベクタテーブルを読み込みハンドラを実行する.
170
171●例外/割込みからのリターン
172
173pcにEXC_RETURNの値を設定することにより,例外/割込みからリターンする.
174pcへの設定に使用可能な命令には制限があり,以下命令が使用可能である.
175
176 ・POP/LDM, LDR, BX
177
178●未解決課題
179
180・ベクターテーブルに登録する関数のアドレスのLSBは'1'にするべきか?
181・NVICは例外・割込みのネスト回数を内部的に管理しているらしい.
182 (!リファレンスを明らかに).
183 ソフトウェアでは,ネストの帳尻を合わせれば,リターンスタックを偽造し
184 ても問題ないか.
185
186
187○OSの実装
188
1891.ターゲット名
190
191 1-1 cm3(Cortex-M3)
192 1-2 armv7m(ARMV7M)
193 1-3 arm_m
194
195cm3では,Coretex-M1(armv6-m)をサポートする場合に問題となる.armv7mでは,
196armv8mがリリースされた場合に問題となる.ARM依存部はJSPでは,armv4とな
197っていたが,armv5やarmv7も動作するためASPでは単にarmとした.そのため,
198arm_mが無難と考えられる.
199
200
2012.ThreadモードとHandlerモードの使い分け
202
203 2-1
204 タスクコンテキストはThreadモード,非タスクコンテキストはHandlerモー
205 ドで動作させる.
206
207 2-2
208 タスクコンテキストと非タスクコンテキスト共にHandlerモードで動作させ
209 る.
210
211プロセッサの設計方針を考慮すると2-1が有力.2-1での問題点としては,割込
212みハンドラからタスクへのリターン時にモードの変更が以下の様に多発するこ
213とが挙げられる.
214
2151.割込みハンドラ : Handlerモード
2162.タスク例外ハンドラの呼び出し : Threadモード
2173.タスクへのリターン処理 : Handlerモード
2184.タスクの再開 : Threadモード
219
2203でHandlerモードに移行する必要があるのは,例外フレームを用いて復帰する
221には,Handlerモードで例外リターン処理を行う必要があるためである.ARMで
222は,複数レジスタのロードとCPSRの復帰を同時に行えるが,M3は行えないため,
223この方法で割込み先のタスクにリターンする必要がある.
224
2252-2の場合の割込みハンドラからタスクへのリターン時にモードの変更を以下
226に示す.また,2-2では割込み優先度の最低値をタスクの実行時の優先度とし
227てリザーブする必要がある.
228
2291.割込みハンドラ : Handlerモード
2302.NVIC優先度マスク'0'を0へ : Threadモード
2313.最低優先度のHandlerモードへ : Handlerモード
2324.タスク例外ハンドラの呼び出し : Handlerモード
2335.タスクへのリターンの前処理 : Threadモード
2343.タスクへのリターン : Handlerモード
2354.タスクの再開 : Handlerモード
236
237割込みハンドラからタスクのリターンに関しては,2-2であっても,2を実行す
238る場合に,NVIC優先度マスクを'0'にするため,例外リターン処理を行う必要
239がある.また,NVIC自体が,割込みのネスト回数を管理しているため,3から4
240への遷移のために,いったん例外/割込みを受付けた状態にする必要があるた
241め,結果的に2-1以上の遷移が必要となる.
242
2432-2の場合は,MSPしか使えないため,割込みの入り口でネスト回数を判断して,
244スタックを入れ替える必要がある.
245
246HRP等でメモリ保護を用いる場合は2-1となる.
247
248以上の理由により,2-1を採用する.ただし2-1は,カーネル起動時とIDLEルー
249プの扱いを検討する必要がある.これらについては別途議論する.
250
251
2523.ディスパッチャの実行モード
253
254 3-1
255 Threadモードで実行する
256
257 3-2
258 Handlerモードで実行する
259
260ディスパッチャをThreadモードで実行すると,割込みによりプリエンプトされ
261たタスクに戻る場合は次のようなパスになる.
262
263 1. ディスパッチャ呼び出し : Threadモード
264 2. ディスパッチャ実行 : Threadモード
265 3. タスク例外実行 : Threadモード
266 4.タスクへのリターン処理 : Handlerモード
267 5. タスクの再開 : Threadモード
268
269割込みハンドラから自らディスパッチしたタスクへリターンする場合は次のパ
270スになる.
271
272 1.割込みハンドラ : Handlerモード
273 2.ディスパッチャ実行 : Threadモード
274 3.タスク例外ハンドラの呼び出し : Threadモード
275 4.タスクへのリターン : Handlerモード
276 5.タスクの再開 : Threadモード
277
278一方,ディスパッチャをHandlerモードで実行すると,割込みによりプリエン
279プトされたタスクに戻る場合は次のようなパスになる.
280
281 1. ディスパッチャ呼び出し : Threadモード
282 2. ディスパッチャ実行 : Handlerモード
283 3. タスク例外実行 : Threadモード
284 4.タスクへのリターン : Handlerモード
285 5. タスクの再開 : Threadモード
286
287割込みハンドラの出口から自らディスパッチしたタスクへリターンする場合は
288次のパスになる.
289
290 1.割込みハンドラ : Handlerモード
291 2.ディスパッチャ実行 : Handlerモード
292 3.タスク例外ハンドラの呼び出し : Threadモード
293 4.タスクへのリターン : Handlerモード
294 5.タスクの再開 : Threadモード
295
296タスク例外ハンドラがないOSの場合は,Handlerモードで実行した方がモード
297の遷移の回数が減るが,タスク例外ハンドラがあると,Threadモードの方が遷
298移回数が減るため,Threadモードとする.
299
300メモリ保護を考慮すると,ディスパッチャはHandlerモードで動作させた方が
301効率がよいと考えられる(SVCでハンドラを呼び出すとHandlerモードとなるた
302め).
303
304
3054.スタックの使い分け
306
307 4-1
308 タスクコンテキストをPSP, 非タスクコンテキストをMSP
309 4-2
310 タスクコンテキスト,非タスクコンテキスト共にMSP
311
3124-2の場合,割込みの入り口でネスト回数を判断して,スタックを入れ替える
313必要がある.2でタスクコンテキストはThreadモード,非タスクコンテキスト
314はHandlerモードで動作させるとしたため,4-1を採用すると,割込みの入り口
315で自動的にスタックが切り替わる.ThreadモードでのPSPのアクセスも,
316mrs/msr命令で行えるため,4-1を採用する.
317
318
3195.コンテキストの判定
320
321 5-1
322 IPSRが'0'(Threadモード)ならタスクタスクコンテキスト,'1'(Handlerモー
323 ド)なら非タスクコンテキストとする.
324
325 5-2
326 割込みのネスト回数を保持する変数を用意.1以上で非タスクコンテキスト.
327
328 5-3
329 アクティブなスタックにより判断(MSPなら非タスクコンテキスト,PSPなら
330 タスクコンテキストとする)
331
3325-1は,ソフトウェア側でコンテキスト管理のための処理を行う必要がないと
333いうメリットがある.しかしながら,カーネルの起動時Threadモードであるた
334め,Handlerモードへ移行する必要がある.ASPカーネルでは,IDLEループ実行
335は非タスクコンテキストとして動作させる必要があるため,IDLEループは
336Handlerモードで動作させる必要がある.IDLEループはディスパッチャから呼
337び出される.3で定めたように,ディスパッチャをThreadモードで動作させる
338ため,IDLEループを呼び出す際には,Handlerモードへ遷移する必要がある.
339Handlerモードへの遷移は,SVC/PendSVCを用いると実現可能であるが,6の割
340込みにプリエンプトされたタスクへのリターン時のHandlerモードへの移行で
341もSVC/PendSVCの使用が必要となるため,SVCハンドラでは,どの目的で呼び出
342されたか判定する必要が出てくるため,オーバヘッドが増大する.
343
3445-2では,カーネル起動時やIDLEループ時に変数を'1'に設定すればよいことに
345なる.この場合,カーネル起動時やIDLEループ時にThreadモードで実行しても
346動作に問題がないよう,特に割込みの出入り口の設計を注意する必要がある.
347
348カーネル起動時に関しては,全割込みを禁止しており,割込みが入らないので
349特に問題はない.IDLEループ時は,ThreadモードでMSPとPSPの選択が可能であ
350ることを利用して,非タスクコンテキストのスタックであるMSPに変更する.
351例外/割込みの入り口では,多重割込みであるかをEXC_RETURNのモード判定の
352ビットではなく,スタックの判定ビットで行えば問題ない.例外/割込みから
353のリターンに関しては,多重割込みの判定は,入り口と同様にEXC_RETURNのス
354タック判定ビットで行えばよい.例外リターン処理時にpcに代入する
355EXC_RETURNの値を一律0xfffffffd (Threadモード with MSP)とするのではなく,
356例外/割込み受付け時にLRに設定されるEXC_RETURNを用いることにより,IDLE
357ループに割り込んだ場合でも問題なくリターンする.
358
359カーネル起動時は,MSPがアクティブであり,割込みハンドラ実行時はHandler
360モードであることからMSPがアクティブでり,IDLEループ時にMSPをアクティブ
361に設定すると,非タスクコンテキストは全て,MSPをアクティブにして動作す
362ることになる.また,割込み時は割込み前にアクティブなスタックの情報が,
363EXC_RETURNに設定される.そのため,コンテキストの判定は,割込みネスト回
364数を保持する変数がなくとも,アクティブなスタックを見ればよいことになる.
365また,exc_sense_context()に関しては,例外フレーム中にEXC_RETURNを追加
366し,その内容により判断すればよい.以上の理由により,5-3を採用する.
367
368
3696.割込みにプリエンプトされたタスクへのリターン時のHandlerモードへの移
370 行方法
371
372 6-1
373 SVCを用いる
374 6-2
375 PendSVCを用いる
376
377PendSVCとSVCの違いは,PendSVCが要求がキューイングされ,SVCは要求がキュ
378ーイングされないことである.割込みにプリエンプトされたタスクへのリター
379ン時のHandlerモードへの移行は,キューイングされずに即座に処理される必
380要があるため,どちらで実現しても問題ない.どちらをカーネルのリソースし
381て使用するかの選択だけである.
382
383どちらを使うとしても,優先度の設定が問題となる.ディスパッチャから割込
384みにプリエンプトされたタスクへのリターンまでの処理は,少なくともCPUロ
385ック状態で実行されなければならない.SVCやPendSVCはどちらも割込み優先度
386を持つため,NVIC優先度マスクよりBASEPRI優先度マスクの方が高い場合,処
387理されない.
388
389CPUロック状態をBASEPRIの設定で実現した場合,その設定値をSVCやPendSVCに
390設定した値より低くする必要がある.言い換えると,SVCやPendSVCの優先度を
391CPUロック時の優先度マスクの値より高い値(他の割込みより高い優先度)と
392する必要がある.
393
394CPUロック状態をFAULTMASKやPRIMASKで実現した場合は,これらが設定される
395と,SVCやPendSVCが受付けられないため,いったんBASEPRIにより割込みをマ
396スクするように設定する必要がある.この場合も,SVCやPendSVCは他の割込み
397より高い優先度を設定する必要がある.
398
399以上により,Handlerモードへの移行のためには,CPUロック状態をBASEPRIで
400実現し,SVCやPendSVCに設定する優先度をカーネル管理内の最高優先度より一
401つ高い優先度に設定する必要がある.
402
403
4047. 例外/割込み出入り口での多重割込みの判断
405
4067-1
407 EXC_RETURNのモード判定ビット
4087-2
409 EXC_RETURNのスタック判定ビット
4107-3
411 割込みネスト回数の管理変数
412
413例外/割込み受付け時は,受付けた例外/割込み以下の割込みは禁止するが,全
414割込み禁止状態にはならない.そのため,割込みネスト回数の管理変数をイン
415クリメントする前に割込みが入る可能性があるため,7-3は使用することがで
416きない.
417
4185で議論した通り,IDLEループをThreadモードで実行するため,7-1ではなく,
4197-2で判断する必要がある.
420
421
4228. IDLEループ
423
4248-1
425 Threadモードで実行
4268-2
427 Handlerモードで実行
428
4295で議論した通り,Threadモードで実行できた方がオーバヘッドが小さい.ま
430た,Threadモードで実行しても,割り込みの出入り口で正しく非タスクコンテ
431キストと判定できれば,Threadモードで問題ない.
432
433
4349.カーネル管理外の割込みのサポート
435
4369-1
437 カーネル管理外の割込みをサポートしない
4389-2
439 カーネル管理外の割込みをサポートする
440
441ベクタテーブルをサポートしており,割込みハンドラもC言語で記述可能であ
442るため,サポートが容易であるため,サポートする.
443
444
44510. CPUロック
446
44710-1
448 BASEPRIを使用
44910-2
450 FAULTMASK/PRIMASKを使用
451
452カーネルの管理外の割込みをサポートするなら,BASEPRIを使用する必要があ
453る.
454
455
45611. 割込みロックとCPU例外の関係
457
45811-1
459 BASEPRIを使用
46011-2
461 FAULTMASK/PRIMASKを使用
462
463FAULTMASK/PRIMASKを使用すると,NMI と Hardware Fault 以外のCPU例外も禁
464止されてしまう.
465
466BASEPRIを用いると,割込みロック中にもCPU例外を受付けたい場合は,
467BASEPRIを用いて,最高優先度をCPU例外のためにリザーブする必要がある.
468
469割込みロック時も,CPU例外を受付けるようにしたければBASEPRIを使用する必
470要がある.
471
472μIRON4.0仕様の3.5.3では,CPU例外の優先度は次のように定められている.
473
474"CPU例外ハンドラの優先順位は,CPU例外が発生した処理の優先度と,ディス
475パッチャの優先順位のいずれかよりも高い."
476
477CPU例外が発生した処理の優先度よりも高いとあるので,CPUロックや割込みロ
478ック状態のタスクで発生した場合でも,優先して実行されるべきだとも考えら
479れる.
480
481一方,TOPPERS標準割込み処理モデルの仕様書では,CPU例外は,プロセッサ毎
482に異なるため,CPU例外の処理モデルの標準化検討の対象外としている.その
483ため,ARM-Mでの扱いを決めて,マニュアルに明記すればよいと考えられる.
484
485
48612. 外部優先度と内部優先度の変換
487
488外部優先度とはAPIで指定する割込み優先度(PRI型)のことであり,値が小さい
489ほど優先度が高い.割込みハンドラには,-1から連続した負の値を設定可能で
490ある.内部優先度は,BASEPRIやNVICの優先度レジスタに設定する値である.
491
492実装される割込み優先度のビット幅を TBITW_IPRI とすると,設定可能な外部
493優先度は次のようになる.
494
495 TIPM_ENAALL(=0)〜 -(1 << TBITW_IPRI)
496
497
49813. カーネル管理内の最高優先度(CPUロック状態での優先度マスク)
499
5006.で述べたように,割込みの出口でSVCハンドラを呼び出す必要があるため,
501SVCハンドラはCPUロック状態のBASEPRIに設定する優先度マスクより高い優先度
502を設定する必要がある.
503
504実装される割込み優先度のビット幅を TBITW_IPRI,優先度中のサブ優先度の
505ビット幅をTBIT_IPRIとすると,CPUロック状態(カーネル管理内割込みに設定
506可能な最高優先度)として指定可能な優先度マスクの設定範囲は以下の値の範
507囲となる.
508
509 -(2^(TBIW_IPRI)) + (2^TBITW_SUBIPRI)) 〜 -1
510
511
51214. 未解決課題
513
514・割込みロックとCPU例外の関係
515 BASEPRIを使ったとしても,あるCPU例外処理中に他の例外が発生すると,そ
516 の例外は受け付けられないため,ITRON仕様は満たせない.
517 ->あきらめてマニュアル記載に逃げるか.
518 メモリプロテクションの例外もマスク可能であるため要件等.
519
520
521以上.
Note: See TracBrowser for help on using the repository browser.