source: atk2-sc3_fl850f1l/arch/v850_gcc/prc_design.txt@ 117

Last change on this file since 117 was 117, checked in by ertl-ishikawa, 9 years ago

ATK2-SC3 1.3.2 FL850F1L(RH850F1L)依存部(GCC/GHS/CCRH)を追加

File size: 18.0 KB
Line 
1
2 TOPPERS/ATK2-SC3
3 <V850依存部設計メモ>
4
5このドキュメントはV850プロセッサ依存部の設計メモを記述したものである.
6
7----------------------------------------------------------------------
8TOPPERS ATK2
9 Toyohashi Open Platform for Embedded Real-Time Systems
10 Automotive Kernel Version 2
11
12Copyright (C) 2013-2014 by Center for Embedded Computing Systems
13 Graduate School of Information Science, Nagoya Univ., JAPAN
14Copyright (C) 2013-2014 by FUJI SOFT INCORPORATED, JAPAN
15Copyright (C) 2013-2014 by Panasonic Advanced Technology Development Co., Ltd., JAPAN
16Copyright (C) 2013-2014 by Renesas Electronics Corporation, JAPAN
17Copyright (C) 2013-2014 by Sunny Giken Inc., JAPAN
18Copyright (C) 2013-2014 by TOSHIBA CORPORATION, JAPAN
19Copyright (C) 2013-2014 by Witz Corporation, JAPAN
20
21上記著作権者は,以下の (1)〜(3)の条件を満たす場合に限り,本ドキュメ
22ント(本ドキュメントを改変したものを含む.以下同じ)を使用・複製・改
23変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
24(1) 本ドキュメントを利用する場合には,上記の著作権表示,この利用条件
25 および下記の無保証規定が,そのままの形でドキュメント中に含まれて
26 いること.
27(2) 本ドキュメントを改変する場合には,ドキュメントを改変した旨の記述
28 を,改変後のドキュメント中に含めること.ただし,改変後のドキュメ
29 ントが,TOPPERSプロジェクト指定の開発成果物である場合には,この限
30 りではない.
31(3) 本ドキュメントの利用により直接的または間接的に生じるいかなる損害
32 からも,上記著作権者およびTOPPERSプロジェクトを免責すること.また,
33 本ドキュメントのユーザまたはエンドユーザからのいかなる理由に基づ
34 く請求からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
35
36本ドキュメントは,AUTOSAR(AUTomotive Open System ARchitecture)仕様
37に基づいている.上記の許諾は,AUTOSARの知的財産権を許諾するものではな
38い.AUTOSARは,AUTOSAR仕様に基づいたソフトウェアを商用目的で利用する
39者に対して,AUTOSARパートナーになることを求めている.
40
41本ドキュメントは,無保証で提供されているものである.上記著作権者およ
42びTOPPERSプロジェクトは,本ドキュメントに関して,特定の使用目的に対す
43る適合性も含めて,いかなる保証も行わない.また,本ドキュメントの利用
44により直接的または間接的に生じたいかなる損害に関しても,その責任を負
45わない.
46
47$Id: prc_design.txt 187 2015-06-25 03:39:04Z t_ishikawa $
48----------------------------------------------------------------------
49
50このドキュメントは,V850E2依存部の設計メモである.作成中のものであり,
51網羅的ではない.GHSに関連した事項もこのメモに記載する.
52
53---------------------------------------------------------------------
54既知の問題
55---------------------------------------------------------------------
56・(GCC) -msoft-float
57 ・gcc 4.7(v12.02)では-msoft-floatオプションが無くなっている.
58
59・(GCC)CubeSuite+(V1.03.000)のLMA非対応
60 ・初期値付き変数のためにVMAとLMAが異なるelfファイルを作成しても,VMA
61 の場所にデータがロードされる.
62 ・実行時には毎回ダウンロード必要.
63
64・(GHS) GNUの Asm("" ::: "memory")相当の命令
65 ・関数単位でpragmaを使いメモリ最適化を抑制する方法はあるが,関数内で
66 使用することはできない.そのため,GNUの Asm("" ::: "memory")相当の
67 命令は存在しない.
68
69---------------------------------------------------------------------
70Tips
71---------------------------------------------------------------------
72FL4にて一定時間後にリセットが発生.
73 ・WDTでVAC機能がONになっている.
74 ・オプションバイトで設定(デバッガより設定)
75 OPBT0 - フラッシュ・マスク・オプションのレジスタ0
76 ・アドレス FF47000CH
77 ・OPBT0の値によっては起動時からWDTが有効となる.
78 ・オール0で停止する.
79 OPBT0の変更
80 ・デバッガでターゲットに接続
81 ・デバッグ・ツールのプロパティフラッシュ・オプションタブに表示される
82 ・「...」ボタンをクリックしてメニューを呼び出して変更.
83
84---------------------------------------------------------------------
85V850E2仕様(V850E2v3)
86---------------------------------------------------------------------
87●割込関連
88
89割込み優先度
90 値が小さいほど優先度が高い
91 0が最高,15が最低優先度.
92
93割込み関連レジスタ
94 ・EICC : 割込み要因の取得
95 ・EIWR : 割込み発生時の作業用レジスタ
96 ・ISPR : 受付中の割込み
97 ・PMR : 割込み優先度マスク
98 ・ISPC : 受付中の割込みのクリア
99
100ベクタ
101 ・割込み要因毎のベクタ.
102 ・割込み毎に16bypte
103 要因 : リターン命令
104 0x00 : リセット
105 0x10 : FEレベルマスカブル割込み : feret
106 0x20 : FEレベルノンマスカブル割込み : feret
107 0x30 : システムエラー例外・周辺保護例外・タイミング監視例外 : feret
108 0x40 : EIレベルソフトウェア例外 : eiret
109 0x50 : EIレベルソフトウェア例外 : eiret
110 0x70 : 浮動小数点演算例外 : eiret
111 0x80 : EIレベルマスカブル割込み : eiret
112
113FEINT/FENMI 割込み
114 ・CPUシステム以外で定義される例外などで利用する.
115 ・例えば、AUTOSARの時間監視などの外付けタイマなどをFEINTにつないで,
116 通常のプログラムの割込み禁止許可(EIレベル)の影響を受けずに割込みを
117 受け付けるようにすることができる.
118 ・FENMIのほうはWatchDogなどを想定している.
119 ・元々は一般アプリとは異なる緊急度の高い割り込みとして機能させることを
120 想定している.
121
122eiret/feret 命令
123 EIレベルの例外処理からの復帰
124 eiret命令
125 FEレベルの例外処理からの復帰
126 feret命令
127 それぞれPSWのEPが0の場合に例外ルーチンの実行を終了したことを外部
128 (割込みコントローラ)に伝える.
129 PSWのEP(bit6)
130 割込み以外の例外処理中であることを示す.このビットがセットされても
131 例外要求の受け付けには影響しない.
132 0 : 割込み処理中である.
133 1 : 割込み以外の例外処理中
134 PSWのNP(bit7)
135 '0' : FEレベル例外処理中ではない.
136 '1' : 多重例外の発生及び割り込みの発生を禁止する.
137・PSWのEP=0の時にeiretをすると,ISPRが割込み前に戻るが,ISPCを使って
138 All 0にクリアすることで良ければ(割込みの一番外のみ実行すればよいなら
139 ),eirteは必要ない.
140・例外に関しては,feretはEP=1となっているので,呼び出しても呼び出さな
141 くても問題ない.
142・FEINT/FENMIはferetを行う必要がある.(ISPRとは別に優先度管理ビットが
143 あり,クリアする必要がある ICSR.FNEとICSR.FIE)
144・PSWのEPが'1'の状態でeiret/feretを実行すれば,単にeipc/eipswまたは
145 fepc/fepswをpc/pswに復帰するのみとなり,特に他に副作用はない.
146
147
148 ・0x10 : FEレベルマスカブル割込み feret
149 ・0x20 : FEレベルノンマスカブル割込み(再開・回復不可能) feret
150 ・0x30 : FE例外 feret
151 システムエラー例外(再開・回復不可能)
152 周辺保護例外(回復不可能)
153 タイミング監視違反
154 実行保護
155 メモリエラー(回復不可能)
156 データ保護
157 コプロセッサ例外
158 予約命令例外
159 FEレベルソフトウェア例外
160 コプロセッサ使用不可
161 予約命令
162 FEレベルソフトウェア例外
163 ->例外要因コード
164 ・0x40 : EIレベルソフトウェア例外(Trap)eiret <- 割込みとして扱う?
165 例外要因コード : 0x40 - 0x4F
166 ・0x50 : EIレベルソフトウェア例外(Trap)eiret <- 割込みとして扱う?
167 例外要因コード : 0x50 - 0x5F
168 ・0x70 : 浮動小数点(回復不可能) eiret <- 割込みとして扱う?
169 浮動小数点例外
170 例外要因コード : 0x71
171 ・0x80 : EIレベルマスカブル割込み
172
173●レジスタ
174
175・システムレジスタバンク
176 ・BSELにより選択
177 ・pswにアクセスする際には常にバンクを切り替えてアクセス.
178
179・レジスタ別名
180 r31 : lp
181 r30 : ep
182 r3 : sp
183 r4 : gp
184 r5 : tp
185
186
187●命令
188
189callt 命令
190・コンパイラオプション -mdisable-callt を付けないと使用される.
191・リンクも含めてコード全体を眺めた時に,最頻出ブロックに関数の出入口処
192 理でのスタック退避/復帰処理がある.このため,コードサイズ縮小のため
193 の共通ブロックとしてCallt命令で呼び出されるコードに変換し、出入口処
194 理の圧縮を図る.
195・各命令に埋め込むよりもコード効率が良い。また、関数にしてFar
196 jump(mov+jmp=64ビット)するよりも小さい(16ビット)という点が利用価値と
197 なる.
198・ただし,Callt命令はflashをアクセスするため,速度低下を招いてしまうた
199 め,速度重視の最適化ではOFFとする.
200
201sld/sst命令(epをベースポインタに使用する)
202・sld/sstは、16ビット命令でサイズ最適化時に局所的に利用される.
203
204---------------------------------------------------------------------
205依存部の設計
206---------------------------------------------------------------------
207●割込処理モデル
208
209割込み禁止
210・IMR(EICn)により実現
211
212割込み優先度
213・PMR(ビットなので注意)により実現
214 0〜15の16段階
215 0が最高優先度15が最低優先度.
216 プロセッサの内部表現と外部表現の関係
217 0〜15,16
218 -16〜-1,0
219
220割込みハンドラ
221・FEレベルマスカブル割込み・ノンマスカブル割込みは扱わないが,例外
222 番号は割り付ける.
223 ・例外番号,1,2
224・EIレベルソフトウェア例外(Trap)は,例外として扱う.
225 ・2種類の例外として,例外番号:4と5
226・浮動小数点(回復不可能)は例外として扱う.
227 ・1種類の例外として扱う,例外番号7
228・FE例外を例外として扱う.例外要因コードがスパースなので,現状では
229 細かい分岐は行わず,全て例外番号3の例外として扱う.
230
231---------------------------------------------------------------------
232GHS対応
233---------------------------------------------------------------------
234●基本
235
236・コンパイラの判断フラグ
237 __ghs__
238
239・リンカスクリプト
240 ほぼGNU互換だが若干異なる
241
242・インラインアセンブラ
243 Asm("" ::: "memory"); 相当が用意されていない.
244 Asm は単にasmでよい.
245 pswの設定,di,eiは組込み関数を使う.
246 psw = __GETSR()
247 __SETSR(psw)
248 __DI();
249 __EI();
250
251・アセンブラマクロ
252 マクロの大枠の書き方は同じだが,引数を参照するときに\が必要ない.
253
254・コマンドライン
255 ccv850
256
257・コンパイルオプション
258 現状以下のオプションで動作を確認.
259 -cpu=v850e2v3 : E2V3対応
260 -gcc : GCC互換機能
261 -preprocess_assembly_files : アセンブリファイルをプリプロセス
262 -kanji=euc : 漢字コードの指定
263 -noobj : アセンブリ言語ファイルを生成(不要なセ
264 クションを削除)
265 -g : デバッグ
266 -O2 : 最適化
267
268 MULTIを使うと以下のオプションも追加となる.
269 -Onone
270 -e
271 -no_japanese_automotive_c
272 --no_exceptions
273 --slash_comment
274 -locatedprogram
275 --no_additional_output
276 -nostrip
277 -Qn
278 -noentry
279 -O2
280 -nostartfiles
281 -srec
282 -kanji=euc
283 --asm_silent
284
285・GNUのasm(:::"memory")相当の記述
286 GHSにはGNUのasm(:::"memory")相当の記述をすることができない.そのため,
287 V850_MEMORY_CHANGED は,空の関数を呼び出すことで実現する.
288
289---------------------------------------------------------------------
290スモールデータエリア(SDA)の有効化
291---------------------------------------------------------------------
292セクション名
293 ・.sdata
294 ・.sbss
295 ・.rosdata
296 ・SMALLCOMMON
297
298---------------------------------------------------------------------
299RH850(V850E3v5)の例外処理
300---------------------------------------------------------------------
301RH850では,例外・割込み発生時にベクタから実行される.ベクタの種類は次
302の通りである.
303
304オフセット : 待避リソース : 名称
3050x0000 : - : リセット
3060x0010 : FE : システムエラー
3070x0020 : FE : ハイパーバイザートラップ
3080x0030 : FE : FEレベルトラップ
3090x0040 : EI : EIレベルトラップ0
3100x0050 : EI : EIレベルトラップ1
3110x0060 : EI : 予約命令例外
3120x0070 : EI : FPU例外
3130x0080 : FE : コプロセッサ使用不可例外
3140x0090 : FE : メモリ保護例外
3150x00a0 : FE : 特権命令例外
3160x00b0 : DB : デバッグ
3170x00c0 : FE : ミスアライン例外
3180x00d0 : ? : R.F.U(reserved for future use)
3190x00e0 : FE : FENMI
3200x00f0 : FE : FEINT
3210x0100 : EI : EI割込み(優先度0)
322 ...
3230x01f0 : EI : EI割込み(優先度15)
324
325
326ジャンプ先については,次のようにする.
327
328リセット -> __start
329
330EI割込み -> interrupt
331
332待避リソース FE -> _fe_exception_entry
333待避リソース EI -> _ei_exception_entry
334
335その他
336デバッグとミスアライン例外に関しては,発生することはないので,ベクタ内
337で無限ループとする.
338
339
340---------------------------------------------------------------------
341V850/RH850のABI
342---------------------------------------------------------------------
343○用語
344・caller : 呼び出し元が保存(呼び出し先は保存なしに使える)
345・callee : 呼び出し先が保存(使用時は保存してから)
346・fixed : 起動時の設定内容を保持
347
348○前提
349・V850は統一したABIがなくコンパイラ毎にABIを定義している
350・RH850ではプロセッサでABIを定義している.
351
352○バージョン
353CX : V2.01.00
354CCRH : V2.01.00
355
356
357○ABI一覧
358
359●V850:GNU
360レジスタ: 別名等 : 扱い
361R0 : ゼロ : fixed
362R1 : コンパイラ・アセンブラが使用 : caller
363R2 : OS予約 : caller (-mapp-regs:ディフォルト), fixed(-mno-app-regs)
364R3 : SP : callee
365R4 : GP : fixed
366R5 : TP : caller (-mapp-regs:ディフォルト), fixed(-mno-app-regs)
367R6-R9 : 関数の引数 : caller
368R10 : 戻り値 : caller
369R11 : 64bitの戻り値 : caller
370R12-R19 : : caller
371R20-R27 : : callee
372R28 : FP : callee
373R29 : : callee
374R30 : EP : caller (-mtda=0時), fixed(未定指定時) *
375R31 : リンクポインタ : caller
376
377SC3では,-mno-app-regsを指定.
378
379
380●V850:GHS(V5)
381レジスタ: 別名等 : 扱い
382R0 : ゼロ : fixed
383R1 : コンパイラ・アセンブラが使用 : caller
384R2 : OS予約 : caller or fixed(-reserve_r2)
385R3 : SP : callee
386R4 : GP : fixed
387R5 : TP(ROSDAベース) : caller or fixed
388R6-R9 : 関数の引数 : caller
389R10 : 戻り値 : caller
390R11 : 64bitの戻り値 : caller
391R12-R19 : : caller
392R20-R27 : : callee
393R28 : FP : callee
394R29 : : callee
395R30 : EP : caller(-notda),or fixed *1
396R31 : リンクポインタ : caller
397
398-notdaはディフォルトで有効.
399
400●V850:CX
401レジスタ: 別名等 : 扱い
402R0 : ゼロ : fixed
403R1 : コンパイラ・アセンブラが使用 : caller
404R2 : OS予約 : fixed
405R3 : SP : callee
406R4 : GP : fixed
407R5 : TP : fixed*1
408R6-R9 : 関数の引数 : caller
409R10 : 戻り値 : caller
410R11 : 64bitの戻り値 : caller
411R12-R19 : : caller
412R20-R27 : : callee
413R28 : FP : callee
414R29 : : callee
415R30 : EP : fixed*2
416R31 : リンクポインタ : caller
417
418*1 関数のアドレスを動的に(プログラム中で)取得しない場合は使用しない.
419*2 該当セクションがない場合は使用しない.
420
421●RH850(CCRH)
422レジスタ: 別名等 : 扱い
423R0 : ゼロ : fixed
424R1 : コンパイラ・アセンブラが使用 : caller
425R2 : OS予約 : caller or fixed
426R3 : SP : callee
427R4 : GP : fixed
428R5 : TP : caller or fixed*1
429R6-R9 : 関数の引数 : caller
430R10 : 戻り値 : caller
431R11 : 64bitの戻り値 : caller
432R12-R19 : : caller
433R20-R27 : : callee
434R28 : FP : callee
435R29 : : callee
436R30 : EP : callee or fixed(-Xep=fix)
437R31 : リンクポインタ : caller
438
439*1 CCRHでは現状fixedはサポートしていない
440
441--------------------------------------------------------------------------
442各コンパイラでのコード共有のためのレジスタの扱い
443--------------------------------------------------------------------------
444各コンパイラ,V850/RH850で扱いが異なるレジスタは次の通りである.
445
446 ・R2
447 ・R5(TP)
448 ・R30(EP)
449
450それぞれのレジスタの扱いについて次のようにする.
451
452●R2
453システム予約としてOS内で使用する(割込み禁止時にアセンブラ内で
454テンポラリレジスタとして使用する).
455そのため,ディスパッチャや割込みのエントリでは保存しない.
456理由
457SC3で必要なため.
458各コンパイラでfixedの扱いに可能.
459・コンパイルオプション指定
460 ・GCC : -mno-app-regs
461 ・GHS(V) : -reserve_r2
462 ・CX : 指定必要なし
463 ・CCRH : -Xreserve_r2
464
465
466●R5(TP)
467アセンブラ内では使用しない。割込みで保存する。
468理由
469CCRHでcallerであるため,割込み出入口で保存復帰の必要がある.
470ifdefを入れると可読性が下がるため一律保存する.
471一方,他のコンパイラではfixedであるため,アセンブラ内で変更で
472きない.CCRXがfixedをサポートした際にはfixedとして扱う.
473
474 各コンパイラのABI
475 ・GCC : -mno-app-regs でR2と共にコンパイラは使用しない
476 ・GHS(V) : fixed (ROSDAベース)
477 ・CX : fixed
478 ・CCRH : caller
479
480●R30(EP)
481 割込みの出入口で保存復帰する.
482 ディスパッチャでも保存復帰する.
483 CX/CCRHでのfixedの使用はサポートしない.
484理由
485 GCC/GHSではcallerであるため割込みの出入口で保存復帰する必要がある.
486 ifdefを入れると可読性が下がるため一律保存する.
487 CCRHではcaleeであるためディスパッチャで保存復帰する必要がある.
488 epはアセンブラの命令長を短くできるため,アセンブラ内で使用しているた
489 めCCRHでも割込みの出入口で保存する.
490 ・GCC : -mtda=0でコンパイラが使用する?
491 ・GHS(V) : -notdaでcaller として扱う
492 ・CX : fixed
493 ・CCRH : fixed or calee
494
495
496---------------------------------------------------------------------
497割込み/ディスパッチャでのレジスタの保存・復帰
498---------------------------------------------------------------------
499○割込み
500
501・該当箇所
502_interrupt と _fe_exception_entry と _ei_exception_entry によるレジスタの保存.
503 ret_exc_2 と ei_ret_exc_2 と ret_int_1 でのレジスタの復帰について
504
505・保存・復帰レジスタ
506callerレジスタは保存する.
507
508 r1, r6-r19, r31
509
510上記の検討よりr30(ep)も保存する.
511
512CCRHの場合はr5(tp)も保存する必要があるが,ifdefを入れると可読性が下が
513るため一律保存する.
514
515以上より,保存するレジスタは次の通りである.
516
517r1, r5(tp),r6-r19, r30(ep), r31
518
519
520○ディスパッチャ
521
522・保存・復帰レジスタ
523calleeレジスタは保存する.
524
525r20-r27,r28,r29
526
527r31(lp)はリターンのために保存する
528
529CCRHではr30(ep)も保存する。ifdefを入れると可読性が下が
530るため一律保存する.
531
532以上より,保存するレジスタは次の通りである.
533
534r20-r27,r28,r29,r30(ep),r31(lp)
535
536
537---------------------------------------------------------------------
538G3K/G3Mにおける一部レジスタ更新時の割込み禁止
539---------------------------------------------------------------------
540
541以下のレジスタはdi状態(PSW.ID=1)で設定する必要がある.
542
543PSW.EBV, EBASE, INTBP, ISPR, PMR, ICSR, INTCFG
544
545以上.
Note: See TracBrowser for help on using the repository browser.