source: asp3_wo_tecs/trunk/arch/arm_m_gcc/common/core_user.txt@ 302

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

TECSレスのASP3の開発のため以下のtrunkからコピー
http://dev.toppers.jp/svn/asp3/branches/WO_TECS-3.C.0

File size: 19.3 KB
Line 
1=====================================================================
2 ARM-Mプロセッサ依存部
3 Last Modified: 2015 Jan 7 01:27:34
4=====================================================================
5
6
7(1) 対応しているターゲットシステムの種類・構成
8
9ARM-M依存部は,ARMVx-Mアーキテクチャをターゲットとしている.ARMVx-Mは,
10ARMとは異なり,ARM命令を実行できないため,ARM依存部と分けている.
11
12
13(2) 使用する開発環境と動作検証した条件(バージョン,オプション等)
14
15カーネルはGCCを用いてコンパイルする.動作確認したバージョンは各ターゲ
16ット依存部のドキュメントに記載する.
17
18
19(3) ターゲット定義事項
20の規定
21
22(3-1) データ型に関する規定
23
24データ型は arch/gcc/tool_stddef.h で定義されている内
25容で,float型と
26double型は,それぞれIEEE754準拠の単精度浮動小数点数と倍精度浮動小数点
27数である.
28
29(3-2) 割込み処理に関する規定
30
31○割込みハンドラ番号と割込み番号の割当て,両者
32の対応
33
34割込みハンドラ番号と割込み番号は,例外発生時にIPSRにセットされる例外番
35号を用いる.SYSTICKは15番で,外部割込みは16番からの番号が割り付けられ
36ている.
37
38○割込み優å…
39ˆåº¦ã®æ®µéšŽæ•°ã¨TMIN_INTPRIの値
40
41割込み優å…
42ˆåº¦ã®æ®µéšŽæ•°ã¯ï¼ŒSoC毎にハードウェア的にサポートする割込み優å…
43ˆ
44度ビット幅
45が異なるので,ターゲット依存部毎に異なる.ターゲット依存部で
46は,割込み優å…
47ˆåº¦ã®ãƒ“ット幅
48(TBITW_IPRI)とその割込み優å…
49ˆåº¦ä¸­ã®ã‚µãƒ–優å…
50ˆ
51度のビット幅
52(TBITW_SUBPRI)を定義する.
53
54各ビット幅
55の値とCFG_INTで使用可能な割込み優å…
56ˆåº¦ã®ç¯„囲は次の通りである.
57
58 -(2^(TBIW_IPRI)) + (2^TBITW_SUBIPRI) 〜 -1
59
60例えば優å…
61ˆåº¦ã®ãƒ“ット幅
62(TBITW_IPRI)が8bit,サブ優å…
63ˆåº¦ã®ãƒ“ット幅
64
65(TBITW_SUBIPRI) が1bitの場合は,-254 〜 -1 の範囲である.
66
67優å…
68ˆåº¦ã®ãƒ“ット幅
69(TBITW_IPRI)が3bit,サブ優å…
70ˆåº¦ã®ãƒ“ット幅
71(TBITW_SUBIPRI)
72が0bitの場合は,-8 〜 -1 の範囲である.
73
74最大優å…
75ˆåº¦(3bitの例では-8)は,内
76部優å…
77ˆåº¦ã¨ã—ては"0x00"となる.この優å…
78ˆ
79度はCPUロックで用いるBASEPRIレジスタではマスクできないため,カーネル管
80理内
81の割込みの最高優å…
82ˆåº¦ï¼ˆTMIN_INTPRI)は,最大値より1つ優å…
83ˆåº¦ãŒä½Žã„値
84以下の値を指定する.
85
86この範囲で,カーネル管理内
87の割込みの最高優å…
88ˆåº¦ï¼ˆTMIN_INTPRI)をターゲ
89ット依存部で設定する.
90
91○dis_intとena_intのサポートの有無,その制限事項
92
93
94dis_intとena_intをサポートする.制限事項
95は特にない.
96
97○CFG_INTの制限事項
98と拡張(ターゲット定義で使用できる割込み属性)
99
100CFG_INTの制限事項
101はなく,ターゲット定義で使用可能な割込み属性は特にな
102い.
103
104○カーネル管理外の割込み
105
106カーネル管理外の割込みをサポートする.指定方法は,割込み優å…
107ˆåº¦ã®æ®µéšŽæ•°
108で指定した,サポートする割込み優å…
109ˆåº¦ã®æœ€é«˜å€¤ï¼ˆæœ€å°å€¤ï¼‰ã‚ˆã‚Šï¼Œ
110TMIN_INTPRIの値を大きく(優å…
111ˆåº¦ã‚’低く)設定すると,TMIN_INTPRIより値が
112小い(高優å…
113ˆåº¦ï¼‰ãªå‰²è¾¼ã¿å„ªå…
114ˆåº¦ã‚’設定した割込みを割込み優å…
115ˆåº¦ã¨ã—て扱う.
116
117カーネル管理外の割込みはOS実行中も禁止になることはなく(厳密には割込み
118の出口でごく短い区間禁止される),割込み発生時は,カーネルのコードを経
119由せずに呼び出される.
120
121カーネル管理外の割込みに対する,DEF_INH,CFG_INTはサポートする.
122
123(3-3) CPU例外処理に関する規定
124
125○CPU例外ハンドラ番号
126
127CPU例外ハンドラ番号としては,例外発生時にIPSRにセットされる,例外番号
128を用いる.各例外の例外番号は以下の通りである.
129
130 例外 例外番号
131 Reset 1
132 Non-makable Interrupt 2
133 Hard Fault 3
134 Memory Management 4
135 Bus Fault 5
136 Usage Fault 6
137 SVCall 11
138 Debug Monitor 12
139 PendSV 14
140
141なお,Resetと,SVCallについては,カーネルが使用するため,ユーザーは使
142用することができない.
143
144ARM-MアーキテクチャではCPU例外に優å…
145ˆåº¦ã‚’設定することが可能である.
146ARM-M依存部では,å…
147¨ã¦ã®CPU例外の優å…
148ˆåº¦ã‚’CPUロックではマスクできないマ
149スク出来ない値(内
150部優å…
151ˆåº¦0)に初期化している.
152
153(3-4) CPUロック・割込みロック
154
155CPUロックは,basepriをTMIN_INTPRIの優å…
156ˆåº¦ã®å‰²è¾¼ã¿ã‚’禁止する値に設定す
157る.割込みロックは,FAULTMASKを'1'に設定することで実現している.
158
159(3-5) 性能評価用システム時刻の参ç…
160§ã«é–¢ã™ã‚‹è¦å®š
161
162get_utmをサポートする.精度に関しては,ターゲット毎に異なる.
163
164(3-6) スタートアップルーチンでの初期化内
165容
166
167スタートアップルーチンは,Threadモードで呼び出されることを前提としてい
168る.実行後,割込みロック状æ…
169‹ï¼ˆFAULTMASKをセット)とする.割込みロック
170状æ…
171‹ã¯ï¼Œã‚«ãƒ¼ãƒãƒ«ã®åˆæœŸåŒ–終了時に許可する.スタートアップルーチンで,
172MSPをアクティブなスタックとし,MSPの内
173容を初期化するためには,INIT_MSP
174をターゲット依存部で定義する.
175
176(3-7) ベクタテーブルオフセットの初期化
177
178プロセッサ依存の初期化処理で,Vector Table Offset Register をターゲッ
179ト依存部の初期化ルーチンで設定する.なお,ベクターテーブルは,.vector
180のセクション属性が付加されているため,リンカスクリプトでこのセクション
181を指定してé…
182ç½®ã™ã‚‹ï¼Ž
183
184(4) ターゲット依存部での設定項
185目
186
187ターゲット依存部では以下のマクロを定義する必
188要がある.
189
190 ・TMAX_INTNO : 割込み番号の最大値(通常の割込み番号 + 15)
191 ・TBITW_IPRI : 割込み優å…
192ˆåº¦ã®ãƒ“ット幅
193
194 ・TBITW_SUBIPRI : 割込み優å…
195ˆåº¦ã®ãƒ“ット幅
196中のサブ優å…
197ˆåº¦ã®ãƒ“ット幅
198
199 ・TMIN_INTPRI : 割込み優å…
200ˆåº¦ã®æœ€å°å€¤ï¼ˆæœ€é«˜å€¤ï¼‰
201 ・TIC_NUME : タイムティックの周期の分子
202 ・TIC_DENO : タイムティックの周期の分母
203 ・TIMER_CLOCK : タイマ値の内
204部表現とミリ秒単位との変換
205 ・INTPRI_TIMER : タイマ割込み割込み優å…
206ˆåº¦
207 ・INTATR_TIMER : タイマ割込みの割込み属性
208 ・INIT_MSP : スタートアップルーチンでMSPを初期化する場合は定義
209 ・DEFAULT_ISTKSZ : スタックサイズ(8byte単位で指定)
210 ・SIL_DLY_TIM1 : 微少時間待
211ちのための定義
212 ・SIL_DLY_TIM2 : 微少時間待
213ちのための定義
214
215(5) ディレクトリ構成・ファイル構成
216 ./arch/arm_m_gcc/common
217 ./arm_m.h
218 ./core.tf
219 ./core_asm.inc
220 ./core_cfg1_out.h
221 ./core_check.tf
222 ./core_kernel_impl.c
223 ./core_kernel_impl.h
224 ./core_def.csv
225 ./core_design.txt
226 ./core_insn.h
227 ./core_kernel.h
228 ./core_offset.tf
229 ./core_rename.def
230 ./core_rename.h
231 ./core_sil.h
232 ./core_stddef.h
233 ./core_support.S
234 ./core_test.h
235 ./core_unrename.h
236 ./core_user.txt
237 ./Makefile.core
238 ./start.S
239
240(6)ARMCCå…
241±æœ‰ã‚³ãƒ¼ãƒ‰ã®è¨˜è¿°æ–¹æ³•
242
243ARMCCとå…
244±æœ‰ã™ã‚‹ã‚³ãƒ¼ãƒ‰ã¯ï¼Œæ¬¡ã®ãƒ«ãƒ¼ãƒ«ã«å¾“ってコードを記述する必
245要がある.
246
2471.メモリバリア命令(Asm("":::"memory"))のマクロ化
248
249ターゲット依存部 ポーティングガイドの(1-6-2)(c)には,次のように記述さ
250れている.
251
252-----
253(c) クリティカルセクションの出å…
254¥å‡¦ç†ã®æœ¬è³ªçš„な部分が,マクロやインライ
255 ン関数呼出しで実現している場合には,クリティカルセクションにå…
256¥ã‚‹å‡¦
257 理の最後と出る処理のå…
258ˆé ­ã«ï¼ŒAsm("":::"memory")という記述をå…
259¥ã‚Œã‚‹ï¼Ž
260-----
261
262メモリバリア命令(Asm("":::"memory"))は,ARMCCと互換性がないため,この
263記述をする箇所は,次のマクロで記述すると,コンパイル時に適切なメモリバ
264リア命令に置き換えられる.
265
266 ARM_MEMORY_CHANGED
267
2682.インクルード方法
269
270ターゲット依存部 ポーティングガイドの1.5には,次のように記述されている.
271
272-----
273その他のヘッダファイルは,「#include "..."」によりインクルードする.ヘッ
274ダファイルが,カレントディレクトリやインクルードするファイルと同じディ
275レクトリ以外のディレクトリに置かれている場合には,次のようにパス指定を
276行う.
277-----
278
279GCC依存部とARMCC依存部でヘッダファイルをå…
280±æœ‰ã§ããªã„場合には,それぞれ
281で同じ名前のファイルを持つ.そして,コンパイルオプションでインクルード
282すべきファイルをå…
283ˆã«æŒ‡å®šã—ている.そのため,ARMCCとå…
284±æœ‰ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ã§
285これらのファイルをインクルードする場合には,「#include "..."」ではなく,
286「#include <...>」で記述し,相対パスではなくファイル名のみを記載するこ
287と.
288
2893.アセンブラディレクティブ
290
291GCCとARMCCのアセンブラディレクティブは互換性がない.そのため,ARMCCと
292å…
293±æœ‰ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ã¯æ¬¡ã«ç¤ºã™ãƒžã‚¯ãƒ­ãƒ‡ã‚£ãƒ¬ã‚¯ãƒ†ã‚£ãƒ–で記述すること.
294
295マクロディレクティブ GCCディレクティブ
296 ASECTION(name) .section name,"a"
297 ATEXT .text
298 AGLOBAL(name) .global name
299 AALIGN(x) .align x
300 ALONG .long
301 ALABEL(label) label:
302 AOR |
303 ATHUMB(name) __athumb name
304
305
306(7)ARMCCå…
307±æœ‰ã‚³ãƒ¼ãƒ‰ã®è¨˜è¿°æ–¹æ³•
308
309○アイドル処理
310
311実行するべきタスクがない場合は,ディスパッチャーで割込みを許可して,割
312込みを待
313つ(dispatcher_2).ARM-M依存部のコードでは,次のようになって
314いる.
315
316 割込みを許可
317 nop
318 割り込み禁止
319
320ターゲット依存で,上記の処理の代わりに,省電力モード等に移行する処理を
321記述したい場合には,ターゲット依存部で,TOPPERS_CUSTOM_IDLEを定義し,
322代わりに実行した処理を toppers_asm_custom_idle というアセンブラマクロ
323として記述する.
324
325なお,toppers_asm_custom_idle の記述にあたっては,次のレジスタは
326oppers_asm_custom_idleの前後で使用するため,oppers_asm_custom_idle 内
327
328で使用する場合は,前後で保存復帰すること.これらのレジスタは Calee
329saved レジスタであるため, oppers_asm_custom_idle として関数呼び出しを
330した場合は,呼び出した関数で自動的に保存復帰されるため,アセンブラレベ
331ルでの保存復帰は必
332要ない.
333
334レジスタ : 内
335容
336r4 : '0'
337r5 : 'IIPM_LOCK'
338r6 : reqflgのアドレス
339r7 : lock_flgのアドレス
340sp : 非タスクコンテキスト用のスタックのå…
341ˆé ­ã‚¢ãƒ‰ãƒ¬ã‚¹(msp)
342
343アセンブラマクロはC言語記述中に展開するとエラーとなる.core_support.S で
344は,TOPPERS_ASM_MACRO というマクロを定義しているため,ターゲット依存部
345で toppers_asm_custom_idle アセンブラマクロを定義する際には,
346TOPPERS_ASM_MACRO を条件コンパイルの条件として用いること.
347
348
349(8) バージョン履歴
350
3512015/01/07
352・ASP3カーネル対応
353
3542012/02/29
355・Makefile.core
356 ・CDEFSにTOPPERS_LABEL_ASMを指定していたが,ARM用のgccではアセンブラ
357 のシンボルの前に_を付けないため削除.
358
3592012/02/02
360・core_config.h
361 ・x_set_ipm()で,iipmが'0'(IIPM_ENAALL)の時の問題を修正.
362・core_support.S
363 ・toppers_asm_custom_idleの前後で使用するレジスタを変更.この変更に
364 より,toppers_asm_custom_idle で関数呼び出しをする場合は,アセンブ
365 ラレベルでのレジスタの保存が必
366要なくなった.
367
3682012/02/23
369・core_support.S
370 ・core_exc_entryでbasepriを読み込んだあと,å…
371¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯çŠ¶æ…
372‹ã®ãƒã‚§
373 ックために上書きしていた問題を修正
374 ・call_texrtnとcall_texrtnの呼び出しをb命令で記述すると,16bit命令と
375 して解釈するコンパイラがあるため,メモリé…
376ç½®ã«ã‚ˆã£ã¦ã¯ãƒ¬ãƒ³ã‚¸ãŒè¶³ã‚Š
377 なくなる.bx命令に変更することで問題を修正.
378
3792012/01/31
380・core_timer.c
381 ・タイマ割込みハンドラにて,probe_int のため,COUNTFLAGをクリアするた
382 めに読み込んでいたレジスタが誤っていた問題を修正.
383
3842011/12/03
385・core_test.h の多重インクルード防止マクロの名称修正
386 ・CHIP を CORE に修正.
387
388・ARMCC対応に伴う変更
389 ・core_asm.inc(追加)
390 ・GCCのアセンブラのディレクティブの定義を記述したファイルを追加.
391 ・core_config.h(変更)
392 ・core_insn.h のインクルード方法を""から<>に変更して,コンパイラの
393 引数で指定された順でインクルードファイルをサーチするよう変更.
394 ・メモリバリア命令(Asm("":::"memory"))をマクロ化してcore_insn.h に
395 定義を使用するよう変更.
396 ・core_insn.h(変更)
397 ・メモリバリア命令(Asm("":::"memory"))のマクロ定義を追加
398 ・core_support.S(変更)
399 ・ARMCCとファイルをå…
400±æœ‰ã™ã‚‹ãŸã‚ï¼Œãƒ‡ã‚£ãƒ¬ã‚¯ãƒ†ã‚£ãƒ–をマクロに書き換え.
401 ・start.S(変更)
402 ・ARMCCとファイルをå…
403±æœ‰ã™ã‚‹ãŸã‚ï¼Œãƒ‡ã‚£ãƒ¬ã‚¯ãƒ†ã‚£ãƒ–をマクロに書き換え.
404
4052011/07/26
406・CCRのSTKALIGNが'1'の場合への対応
407 割込み・例外の出å…
408¥å£å‡¦ç†ã§ã¯ï¼Œã‚¹ã‚¿ãƒƒã‚¯ã¯å¸¸ã«8byte境界となるように変
409 更.
410
4112011/07/25
412・CPU例外の優å…
413ˆåº¦ã®åˆæœŸåŒ–
414 CPUロックでマスクできない優å…
415ˆåº¦ï¼ˆå†…
416部優å…
417ˆåº¦0)に初期化する処理を追加.
418
419・CFG_INTで使用できる割込み優å…
420ˆåº¦ã®æœ€å¤§å€¤ã®ä¿®æ­£(core.tf)
421 ・最大値が1つ大きな値となっていた.
422
423・カーネル管理外の割込みの扱いの変更
424 ・å…
425±é€šéƒ¨ã§ã®æ‰±ã„の変更に伴う変更.
426
427・タイマ割込みハンドラでのCOUNTFLAGのクリア処理の修正
428 SYSTIC_CONTROL_STATUSレジスタのCOUNTFLAGをクリアするには,
429 SYSTIC_CURRENT_VALUEレジスタを読み込む必
430要があるが,誤って
431 SYSTIC_CONTROL_STATUSレジスタを読み込んでいた.
432
433・core_int_entryにおけるbasepriの設定
434 NVIC優å…
435ˆåº¦ãƒžã‚¹ã‚¯ãŒè‡ªå‹•çš„に設定されるため優å…
436ˆåº¦ãƒžã‚¹ã‚¯ã®ç‚¹ã§ã¯å¿…
437要な
438 いが,x_get_ipm()がbasepriを参ç…
439§ã™ã‚‹ãŸã‚ï¼Œbasepriも更新するよう変更.
440
4412011/07/24
442・_ret_int_2/svc_handler の変更
443 割込み優å…
444ˆåº¦ãƒžã‚¹ã‚¯ãŒå…
445¨è§£é™¤çŠ¶æ…
446‹ã§ã—かタスク例外を呼び出さないように
447 仕様が変更されたため,_ret_int_2では,割込み優å…
448ˆåº¦ãƒžã‚¹ã‚¯ã‚’,å…
449¨è§£é™¤
450 状æ…
451‹ï¼ˆTIPM_ENAALL)に設定するよう変更.
452 svc_handlerはタスクにリターンする時にbasepriをIIPM_ENAALLにするよう
453 に変更.
454
455・x_config_int()/set_exc_int_priority()の修正
456 x_config_int()から,set_exc_int_priority()に対して外部優å…
457ˆåº¦ã‚’引数に
458 して呼び出しいたため,内
459部優å…
460ˆåº¦ã‚’引数で呼び出すよう修正.
461 set_exc_int_priority()も受け取った引数を内
462部優å…
463ˆåº¦ã¨ã—て優å…
464ˆåº¦ã‚’設定
465 するように修正.
466
4672011/07/23
468・å…
469±é€šéƒ¨ã‚’1.4.0にupdate.
470
471・arm依存部と同様にチップ依存部を置けるようにディレクトリ構造を変更
472
473・arm依存部と同様にファイル名のプリフィックスをcoreに変更.
474
475・call_atexitの削除
476 software_term_hook の呼び出しは,core_terminate()に移動.
477
478・å…
479±é€šéƒ¨ã‚’1.7.0にupdate.
480
481・タスクコンテキストブロックの型名の変更
482 CTXB型をTSKCTXB型に名称変更.
483
484・ターゲット依存部でサポートする機能を示すマクロの変更
485 TOPPERS_SUPPORT_DIS_INTをTOPPERS_TARGET_SUPPORT_DIS_INTに,
486 TOPPERS_SUPPORT_ENA_INTをTOPPERS_TARGET_SUPPORT_ENA_INTに,
487 変更.
488
489・exc_sense_unlockの定義を削除.
490
491・オフセットファイルをコンフィギュレータで生成する方法への対応
492
493・CHECK_FUNC_ALIGN,CHECK_FUNC_NONNULL,CHECK_STACK_ALIGN,
494 CHECK_STACK_NONNULL,CHECK_MPF_ALIGN,CHECK_MPF_NONNULLの定義を,タ
495 ーゲット依存部のテンプレートファイル(パス3)からヘッダファイルに移
496 動.
497
498・割込みと例外のå…
499¥ã‚Šå£å‡¦ç†ã®åå‰ã‚’変更
500 int_entryをcore_int_entryへexc_entryをcore_exc_entryに変更.
501 オフセットの取得方法が変更となったため,å…
502ƒã®åå‰ã®ã¾ã¾ã ã¨cfg1_out.c
503 がコンパイルエラーとなるために変更.
504
505・ターゲット依存部で定義する名称のリネームの追加
506
507・call_texrtnを呼び出す条件に「ipmflgがtrue」を追加
508
509・カーネル管理外のCPU例外の扱いの変更
510
5112011/07/22
512・x_disable_int() : prc_config.h の修正
513 割込み禁止レジスタのアドレスを取得する際に,ベースの値をuint32_tの
514 ポインタにキャストしていなったため,正しいアドレスが生成できていな
515 かった問題を修正.
516
517・非タスクコンテキスト用のスタックの初期値マクロ(TOPPERS_ISTKPT)の修正
518 : prc_config.h
519 バイト単位で取得するように,(char_t *) にキャストして掲載するように修
520 正.
521
522・LOG_INH_ENTRYとLOG_INH_LEAVEの誤記 : prc_support.S
523 LOG_INH_ENTRYとLOG_INH_LEAVEであるべき箇所が LOG_EXC_ENTRYと
524 LOG_EXC_ENTRYになっている問題を修正.
525
526・TOPPERS_CUSTOM_IDLE のtypoの修正 : prc_support.S
527
528・svn_hanlderの修正 : prc_support.S
529 一律EXC_FRAME_SIZE分のスタックを捨てていたが,Configureation and
530 Control Register(CCR)のSTKALIGNが'1'の場 合は,8byte境界にアライン
531 されるため,捨てるサイズが異なる.アラインされたかは,xPSRの9ビッ
532 トをチェックすることにより判定する.
533
534・prc.tfの修正
535 boostのバージョンによって変わる挙動を吸収.
536 http://www.toppers.jp/TOPPERS-USERS/201004/msg00034.html
537
538・_kernel_istkpt の削除 : prc_cfg1_out.h
539 _kernel_istkpt が必
540要ないターゲットが存在するため,必
541要なら,ターゲ
542 ット依存部で定義するように変更.
543
5442008/08/22
545・prc_user.txt/prc_design.txt
546 ・2008/8/21の技術検討会での議論結果を反映.
547
548・prc_support.S/prc_config.c/prc_config.h/arm_m.h
549 ・コンテキスト判定をexc_ncntからアクティブなスタックに変更
550
551・prc_config.c
552 ・set_exc_int_priority() でサポート可能なIRQの上限を239に拡張.
553
554・start.S
555 ・起動時はThreadモードを前提としていることを明記.
556 ・ブートローダー等から起動される場合を想定し,MSPを有効にするように
557 変更.
558
559・prc_timer.c
560 ・コメントを修正
561 ・デバッグ用コードを削除
562
5632008/07/11
564・最初のリリース
Note: See TracBrowser for help on using the repository browser.