source: ssp_qb_r5f100le_cs/trunk/arch/rl78_ca78k0r/prc_user.txt@ 95

Last change on this file since 95 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: 14.3 KB
Line 
1=====================================================================
2 RL78プロセッサ依存部
3 Last Modified: '15/6/2
4=====================================================================
5
6
7(1) 対応しているターゲットシステムの種類・構成
8
9RL78プロセッサ依存部(以下,RL78依存部)は,ルネサスエレクトロニクス製 RL78ファミリ
10のプロセッサを主なターゲットとする.RL78ファミリは,いくつかのグループ,
11そしてまたそのグループの中に,様々な型番で表現されるプロセッサのバリエーションが
12存在している.
13
14ただし,本プロセッサ依存部において,現状では,サポートするターゲットボードとの関係から,
15RL78/G13 に関する定義のみを用意している.
16
17
18(2) プロセッサ依存部のファイル構成
19
20リアルタイムOSカーネルのプロセッサ依存部として実装する部分のみを考えた場合,
21RL78依存部の定義は,大抵の場合,全てのプロセッサに共通する部分と,
22プロセッサの型番で異なる部分(※1)とにコードを整理することが可能である.
23異なる部分についてはプロセッサ型番に基づくファイルを用意している.
24
25※1 割込み番号,割込みハンドラ番号,及び,割込み制御レジスタの配置など
26
27以上より,プロセッサ依存部のコードは,以下の命名規則に従って用意された
28ファイルへ,共通部分と可変部分とに分類して配置されている.
29
30prc_* : 全てのプロセッサに共通する定義
31rl78g13_* など:プロセッサ型番毎に異なる定義
32
33定義の配置はサポートするプロセッサを増やす毎に見直しが必要となるかもしれない.
34もし現状のコード配置で不都合が生じる場合にはサポートメーリングリストまで
35ご連絡頂けると幸いである.
36
37
38(3) 使用する開発環境と動作検証した条件
39
40コンパイル,及びビルド管理にはルネサスエレクトロニクス製ツールを用いる.
41動作確認したバージョンはターゲット依存部のドキュメントに記載する.
42
43
44(4) ターゲット定義事項の規定
45
46(4-1) データ型に関する規定
47
48TOPPERS共通データ型のうち,TOPPERS新世代カーネル統合仕様書(以下,統合仕様書)で
49オプション扱いとされているデータ型を対象に,ターゲット依存部でのサポート状況について
50記述する.これらの定義は arch/ca78k0r/tool_stddef.h で定義されている
51
52【整数型】
53
54・サポート
55 int8_t 符号付き8ビット整数(オプション,C99準拠)
56 uint8_t 符号無し8ビット整数(オプション,C99準拠)
57 float32_t IEEE754準拠の32ビット単精度浮動小数点数(オプション)
58
59 このうち,float32_t は,IEEE754準拠の単精度浮動小数点数である.
60
61・未サポート
62 int64_t 符号付き64ビット整数(オプション,C99準拠)
63 uint64_t 符号無し64ビット整数(オプション,C99準拠)
64 double64_t IEEE754準拠の64ビット倍精度浮動小数点数(オプション)
65 int128_t 符号付き128ビット整数(オプション,C99準拠)
66 uint128_t 符号無し128ビット整数(オプション,C99準拠)
67
68【最大値,最小値の定数】
69
70・サポート
71 INT8_MAX int8_tに格納できる最大値(オプション,C99準拠)
72 INT8_MIN int8_tに格納できる最小値(オプション,C99準拠)
73 UINT8_MAX uint8_tに格納できる最大値(オプション,C99準拠)
74 FLOAT32_MIN float32_tに格納できる最小の正規化された正の浮動小数点数(オプション)
75 FLOAT32_MAX float32_tに格納できる表現可能な最大の有限浮動小数点数(オプション)
76
77・未サポート
78 INT64_MAX int64_tに格納できる最大値(オプション,C99準拠)
79 INT64_MIN int64_tに格納できる最小値(オプション,C99準拠)
80 UINT64_MAX uint64_tに格納できる最大値(オプション,C99準拠)
81 DOUBLE64_MIN double64_tに格納できる最小の正規化された正の浮動小数点数(オプション)
82 DOUBLE64_MAX double64_tに格納できる表現可能な最大の有限浮動小数点数(オプション)
83 INT128_MAX int128_tに格納できる最大値(オプション,C99準拠)
84 INT128_MIN int128_tに格納できる最小値(オプション,C99準拠)
85 UINT128_MAX uint128_tに格納できる最大値(オプション,C99準拠)
86
87(4-2) 割込み処理に関する規定
88
89(4-2-1) 割込みハンドラ番号と割込み番号の割当て,両者の対応
90
91割込みハンドラ番号(inhno)と割込み番号(intno)は,共にデフォルトプライオリティの値を用いる.
92両者は基本的に同じ番号が1対1に対応する.従って使用可能な全ての割込み番号に対して
93割込みサービスルーチン(ISR)を登録可能である.
94割込み番号,割込みハンドラ番号は <プロセッサ名>.h ファイルで定義している.
95(例えば rl78g13.h など)
96
97(4-2-2) 割込み優先度の段階数(TMIN_INTPRIの値),その設定方法
98
99カーネル管理外の割込みに対する,DEF_INH,CFG_INTはサポートする.
100そのため,RL78依存部で CFG_INT のパラメータとして指定可能な割込み優先度の値は,
101RL78 が持つ割込み優先度レベルの値の範囲に対応して -1(=TMAX_INTPRI) から -4 までの
102値を設定可能である(※2)(※3).ただし,後述するように,TMIN_INTPRI で定義される値に応じて,
103カーネル管理及びカーネル管理外の割込みハンドラに指定可能な値の範囲が変化する.
104
105CFG_INT で設定された割込み要求ラインにカーネル管理の割込みハンドラを
106登録する場合は,TMAX_INTPRI 以下,TMIN_INTPRI 以上の値を指定しなければならない.
107他方,カーネル管理外の割込みハンドラを登録する割込み要求ラインを設定する場合は,
108TMIN_INTPRI より小さく,-4 以上の値を指定しなければならない.
109
110(※2) カーネルの割込み処理モデルの上では割込み優先度を -1 から始まる負数で
111   表現することになっているため,負号がついている.
112
113(※3) TMIN_INTPRI を -4 にした場合,CFG_INT で優先度 -4 に設定した割込み要因は,
114CPUロック状態にしない限り何重にも多重割込みが可能となるため,注意が必要である.
115
116(4-2-3) カーネル管理外の割込み
117
118RL78依存部では,カーネル管理外の割込みをサポートしている.
119
120TMIN_INTPRI より高い(数値としてはより小さい)割込み優先度に設定された
121割込み要求ラインの割込みは,カーネル管理外の割込みとして用いることが
122可能である.カーネル管理外の割込みはOS実行中も禁止になることはなく
123(厳密には割込みの出口でごく短い区間禁止される),割込み発生時は,
124カーネルのコードを経由せずに呼び出される.
125
126TMIN_INTPRI はカーネル管理の割込みに設定することのできる割込み優先度の最高値
127(値としては最小値)を定義したマクロで,arch/m16c_ncxx/prc_kernel.h で
128定義されている.既定では,-3となっている.この値はターゲット依存部で上書きが可能である.
129
130(4-2-4) カーネル管理外の割込みの設定方法
131
132CFG_INT, DEF_INH を用いてカーネル管理外の割込みハンドラを登録する場合の制約は,
133(1) DEF_INH で登録する割込みハンドラの属性として TA_NONKERNEL を指定すること,
134及び,(2) ハンドラ登録先の割込み要求ラインがもつ割込み優先度は,
135CFG_INT により TMIN_INTPRI より高く (値としては小さい値)に設定すること,
136である.
137
138(4-2-5) カーネル管理外の割込みハンドラの記述方法
139
140カーネル管理外の割込みハンドラは,以下のように引数,戻り値が共に void の関数
141として実装すること.
142
143void
144interrupt_handler (void)
145{
146 /* ハンドラの内容 */
147}
148
149(4-2-6) CFG_INT でターゲット独自に使用できる割込み属性
150
151INT割込みに関してのみ,割込み要求ラインのトリガモードの設定をサポートする.
152設定できるのは,以下のいずれかである.
153 ・ポジティブエッジ(トリガ割込み):TA_POSEDGE
154 ・ネガティブエッジ(トリガ割込み):TA_NEGEDGE
155 ・両エッジ(トリガ割込み):TA_BOTHEDGE
156
157(4-2-7) dis_intとena_intのサポートの有無,その制限事項
158
159RL78依存部では dis_int 及び ena_int をサポートする.制限事項は特にない.
160
161TOPPERS割込み処理モデルにおける割込み要求禁止フラグは
162RL78プロセッサの割込みマスク・フラグ・レジスタが対応する.
163
164(4-2-8) 多重割込みのサポート
165
166多重割込みを許可する.ただし,カーネル管理外の割込みの場合,割込みハンドラの中で
167PSWレジスタのIEビットを明示的にセットし,割込み許可にしなければ多重割込みが
168有効とならないため,注意が必要である.
169
170また TMIN_INTPRI==-4 の場合,CFG_INT で -4 に設定した割込みは,
171CPUロック解除状態において同じ優先度 -4 の割込み処理が実行中でも
172多重に割込みが受け付けられる.これはRL78のプロセッサの仕様によるもので,
173PSWのIEビットが1である限り,(プロセッサ内部表現における)レベル0の割込み
174(割込み処理モデルでは優先度-4の割込み)は,PSWのISPを使用した
175レベルによる割込みのマスクを行うことができない.
176
177割込み優先度-4 のカーネル管理の割込みハンドラはCPUロック解除状態で
178起動されるため,注意が必要である.
179
180(4-2-9) 割込みサービスルーチンも割込みハンドラも登録していない割込み要求
181
182ある割込み要求ラインで割込み要求を受け付けたが,そのラインに割込みサービスルーチン及び
183割込みハンドラのどちらも登録していない場合,_unused_interrupt (prc_support.asm) へ
184ジャンプするようにコンフィギュレータが割込みベクタを生成する.そして,
185そこから即座にリターンするようになっている.
186
187
188(4-3) CPU例外処理に関する規定
189
190(4-3-1) CPU例外ハンドラ番号
191
192RL78 依存部ではBRK命令によるソフトウェア割込みをCPU例外として扱う.
193CPU例外ハンドラ番号として0 を割り振ることにする.
194
195各CPU例外に対する CPU例外ハンドラ番号は以下の通り.
196これらは <プロセッサ名>.h で定義されている.
197
198 例外 例外番号
199#define EXCNO_BRK 0 /* ソフトウェアベクタ割込み命令 */
200
201
202(4-3-2) ハンドラを登録していないCPU例外が発生したとき
203
204発生したCPU例外に対して,CPU例外ハンドラが登録されていない場合,
205_unused_interrupt (prc_support.asm) へジャンプするようにコンフィギュレータが
206割込みベクタを生成する.そして,そこから即座にリターンする.
207
208(4-3-3) ソフトウェア割込みの扱い
209
210ソフトウェア割込みに対するハンドラは DEF_EXC で呼び出すことはできない.
211一方,DEF_INH を用いて呼出し可能であるが,ソフトウェア割込みは厳密には
212CPU例外に属するものであり,しかもノンマスカブルであるため,
213システムコールを呼び出すなどの通常の割込みハンドラと同様の使用は避けた
214方が無難である.
215
216
217(4-4) CPUロック・割込みロック
218
219割込みロック状態は,PSWレジスタのIEビットにより実現している.
220IEビットが0のとき割込みロック状態,1のとき割込みロック解除状態とする.
221
222カーネルのCPUロック状態は,TMIN_INTPRI で定義する値により異なる.
223
224(4-4-1) TMIN_INTPRI が -4 の場合
225
226CPUロック状態は,PSWレジスタのIEビットにより実現する.
227IEビットが0のときCPUロック状態,1のときCPUロック解除状態とする.
228この場合,CPUロックと割込みロックは同じである.
229
230(4-4-2) TMIN_INTPRI が -1 以上 -3 以下の場合
231
232PSWのインサービス・プライオリティフラグ(ISP{1,0})の値を
233(-TMIN_INTPRI+3) に設定することで実現する.
234例えば -3 の場合,PSW レジスタの ISP{1,0} が (0,0) に設定される.
235
236RL78 では,ISP{1,0} に設定した値「以上(値としては小)」の優先順位を持つ割込みが
237「許可」される,という仕様になっている.したがって,マスクしたいレベルより
238一段高い値をセットする必要がある.
239
240
241(4-5) 性能評価用システム時刻の参照に関する規定
242
243get_utmをサポートする予定であるがまだ実装していない.
244
245
246(4-6) システム初期化手順の内容
247
248スタートアップルーチンは,システムリセット直後に呼び出され,実行を開始する.
249その際のプロセッサ状態は以下を前提としている.
250 ・SP, MAA は未初期化
251 ・レジスタバンクは RB0
252 ・PSWレジスタのIEフラグが0 (割込みロック状態と同等の状態)
253 ・PSWレジスタのISP=(1,1)
254 ・システムクロックは未初期化(内部オシレータ動作 1MHz)
255 ・メモリ未初期化(もしソフトウェアリセットを独自に実装していれば保持されている)
256
257まず,スタートアップルーチンの start (start.asm) が以下の処理を行う.
258 ISP, MAA の初期化
259 メモリ初期化
260 sta_ker (startup.c) コール
261そして,target_initialize (target_config.c) にてクロック設定が行われる.
262
263その後,dispatcher (task.c) を実行する前に CPUロック状態かつ割込みロック解除状態に
264しておく必要があるため,start_dispatch (prc_support.asm)において
265PSW レジスタの ISP 及び IEビットを,以下の値にセットする.
266
267(a) TMIN_INTPRI が -1 以下かつ -3 以上の場合
268 IPL=-(TMIN_INTPRI)+3 かつ,IEビット=1
269
270(b) TMIN_INTPRI==-4の場合
271 IPL=3 かつ,IEビット=0
272
273さらに,dispatcher は無限ループでリターンしないため,ジャンプ前に
274start_dispatch でスタックの初期化を行っている.
275
276
277(4-7) システム終了手順
278
279システム終了時は call_exit_kernel (prc_support.asm) でスタックを初期化し,
280exit_kernel (startup.c) を呼び出す.
281
282その後,target_exit (target_config.c) でターゲット依存の終了を行う.
283規定では無限ループさせるのみで特に何もしていない.
284もし,ターゲット固有の終了処理を行う必要がある場合,target_exit もしくは
285そこから呼び出される関数で処理を実施する.
286
287
288(5) タイマドライバ関連の情報
289
290最小セットカーネルの拡張機能として周期ハンドラ及びアラームハンドラが
291用意されている.これらを使用するためにはタイムティックを供給する
292タイマドライバをターゲットで用意する必要がある.
293
294
295(6) 制限事項
296
297・カーネルのコンフィギュレーション
298 コンフィギュレーションのパス3(ビルド後の構成チェック)は行っていない。
299 そのため,タスク,割込みハンドラ,割込みサービスルーチン,CPU例外ハンドラ,
300 初期化処理ルーチン,終了処理ルーチン,周期ハンドラ,アラームハンドラが
301 不正である場合を E_PAR エラーとして検出することができない.
302 従ってアプリケーション開発時にテストすることでこれらの異常を検出する必要がある.
303
304・文字コード,改行コードについて
305 RL78プロセッサ依存部は Windows上で動作する開発環境 CubeSuite+ を用いて
306 開発することを前提としている.TOPPERSプロジェクトから公開されるソースパッケージは
307 文字コードはSJIS, 改行コードは CR+LF として公開している.
308
309
310(7) サポートプロセッサの追加
311
312(7-1) プロセッサ毎の定義事項
313
314プロセッサ毎に異なる事項としては以下の事項がある.
315 ・有効な割込み番号,割込みハンドラ番号,CPU例外ハンドラ番号の範囲
316 ・割込み番号,割込みハンドラ番号,CPU例外ハンドラ番号の割り当て
317
318従って,サポートするプロセッサを追加する場合には,まずプロセッサ名に基づく
319次のファイルを用意する.例えば RL78/G13 の場合,
320 rl78g13.h
321 割込み番号,割込みハンドラ番号,CPU例外ハンドラ番号の定義
322 rl78g13_config.h
323 割込み番号の最大値(INTNO_MAX), 有効な割込み番号
324 rl78g13.tf
325 ・CFG_INT, DEF_INH, ATT_ISR, DEF_EXC などで指定可能なパラメータ値の定義
326 ・有効な割込み番号,割込みハンドラ番号,CPU例外ハンドラ番号の範囲の定義
327 $INTNO_VALID
328 $INHNO_VALID
329 $EXCNO_VALID
330 ・割込み番号,割込みハンドラ番号,CPU例外ハンドラ番号の範囲(無効値も含む)
331 $INTNO_RANGE
332 $INHNO_RANGE
333 $EXCNO_RANGE
334
335そしてこれらが,ビルド過程で使用されるように,ターゲット依存部のファイルから
336これらをインクルードする.
337 rl78g13_config.h の場合,target_config.h から
338 rl78g13.h の場合,<ターゲット名称>.h から
339 rl78g13.tf の場合,ターゲット依存部のCFG用テンプレートファイル(target.tf) から
340 ・target.tf では,prc.tf をインクルードする前に,使用するターゲットプロセッサの
341  CFG用テンプレートファイル(この場合,rl78g13.tf)をインクルードすること.
342
343また,これらのファイルから,それぞれのファイルに対応する共通部分の
344ファイルをインクルードする
345 rl78g13_config.h の場合,prc_config.h を
346 rl78g13.tf の場合,prc.tf (M16Cファミリの全プロセッサに共通のtf)を
347
348上記以外に,prc_ で定義されている事項の中に,これまでとは異なる定義の仕方を
349しなければならないものが出てくるかもしれない.その場合は,定義の配置を
350変更する必要があるため,サポートメーリングリストへ報告頂ければ幸いである.
351報告頂いた場合,以降のバージョンアップにて対応する予定である.
352
353
354○変更履歴
3552014/8/21 ・新規作成
3562014/9/05 ・TMIN_INTPRI が -4 の場合にも対応したため,関連箇所を追記.
3572014/10/14 ・TMIN_INTPRI が -4 の場合の多重割込みについて注意事項を追記(4-2-2,4-2-8).
358 ・TMIN_INTPRI を -4 にした場合にアセンブラのオプションを変更する
359  必要がなくなったため,一部記載を削除.(4-4-1)
360 ・システム初期化手順での処理内容について TMIN_INTPRI が -4 の場合を追加(4-6).
3612014/10/15 ・多重割込みの注意事項について一部修正(4-2-8).
3622015/6/2 ・SSP-1.3.0対応
363以上
Note: See TracBrowser for help on using the repository browser.