source: anotherchoice/tags/jsp-1.4.4-full-UTF8/doc/sh1.txt@ 363

Last change on this file since 363 was 363, checked in by ykominami, 5 years ago

add tags/jsp-1.4.4-full-UTF8

  • Property svn:executable set to *
File size: 42.9 KB
Line 
1
2 = TOPPERS/JSPカーネル ユーザズマニュアル =
3 (SH1 ターゲット依存部)
4
5 (Release 1.4.2対応,最終更新: 24-Jun-2010)
6
7------------------------------------------------------------------------
8 TOPPERS/JSP Kernel
9 Toyohashi Open Platform for Embedded Real-Time Systems/
10 Just Standard Profile Kernel
11
12 Copyright (C) 2000-2004 by Embedded and Real-Time Systems Laboratory
13 Toyohashi Univ. of Technology, JAPAN
14 Copyright (C) 2001-2010 by Industrial Technology Institute,
15 Miyagi Prefectural Government, JAPAN
16
17 上記著作権者
18は,以下の (1)〜(4) の条件か,Free Software Foundation
19 によってå…
20¬è¡¨ã•ã‚Œã¦ã„ã‚‹ GNU General Public License の Version 2 に記
21 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア
22 を改変したものを含む.以下同じ)を使用・複製・改変・再é…
23å¸ƒï¼ˆä»¥ä¸‹ï¼Œ
24 利用と呼ぶ)することを無償で許諾する.
25 (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
26 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
27 スコード中に含まれていること.
28 (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
29 用できる形で再é…
30å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
31å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
32 者
33マニュアルなど)に,上記の著作権表示,この利用条件および下記
34 の無保証規定を掲載すること.
35 (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
36 用できない形で再é…
37å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
38 と.
39 (a) 再é…
40å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
41マニュアルなど)に,上記の著
42 作権表示,この利用条件および下記の無保証規定を掲載すること.
43 (b) 再é…
44å¸ƒã®å½¢æ…
45‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
46 報告すること.
47 (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
48 害からも,上記著作権者
49およびTOPPERSプロジェクトをå…
50è²¬ã™ã‚‹ã“と.
51
52 本ソフトウェアは,無保証で提供されているものである.上記著作権者
53お
54 よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も
55 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直
56 接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
57
58 @(#) $Id: sh1.txt,v 1.25 2005/11/14 08:00:54 honda Exp $
59------------------------------------------------------------------------
60
61
621.SH1 ターゲット依存部の概要
63
641.1 ターゲットシステムと開発環境
65
66SH1プロセッサのターゲットシステムとしては、SH7032を搭載した以下のボード
67をサポートしている。
68
69・京都マイクロコンピュータ(株)製のKZ-SH1-01(CPU: HD6417032F20)
70・CQ出版(株)製のRISC評価キット SH-1(CPU: HD6417032F20)
71・(株)中央製作所製のμITRON搭載SH1CPUボード(CPU: HD6417034F20)
72
73開発環境には、GCC などの GNU開発環境を用い、オブジェクトファイルフォー
74マットは ELF を標準とする。
75
76実行環境はROM化した場合をサポートしている。Makefile.config中で,変
77数DBGENVにROMを設定している。(大å…
78ƒã®MakefileでGDB_STUBに設定される
79のを防ぐため)
80
81
821.2 サポートする機能の概要
83
84SH1依存の機能として、割込みマスクの変更・参ç…
85§(chg_ixx、get_ixx)と、
86性能評価用システム時刻参ç…
87§æ©Ÿèƒ½(vxget_tim)をサポートしている。割込み
88の禁止と許可(dis_int、ena_int)はサポートしていない。
89
901.3 他のターゲットへのポーティング
91
92現バージョンでは、SH7032をサポートしている。SHシリーズはSH1,SH2とSH3以
93降では割込みの扱いがかなり異なる。å…
94·ä½“的にはSH1、SH2はベクタテーブルを
95参ç…
96§ã—て、割込み要因別に用意された割込みハンドラに分岐する。これに対し
97て、SH3、SH4では割り込み要因によらず一度同一の割込みハンドラに分岐した
98後、割り込み要因がセットされたレジスタを参ç…
99§ã—て再度、分岐する。
100
1011.4 GDB スタブ
102
103TOPPERS/JSP カーネル SH1版はGDBスタブ上でのデバッグをサポートしている。
104動作確認は京都マイクロコンピュータ(株)製のKZ-SH1-01で行った。
105GDBスタブと組み合わせて使用することを考æ…
106®ã—て、他機種版のJSPカーネルと
107同様に、ソースコード内
108にマクロGDB_STUBによる条件コンパイルの設定を行っ
109ている。実行環境の設定は$(SYS)/Makefile.config内
110の変数DBGENVで行う。
111SH1用のGDBスタブは現在、å…
112¬é–‹æº–備中であり、間もなくå…
113¬é–‹äºˆå®šã§ã‚る。
114
1151.5 シリアルポート
116
117カーネルのログ出力用にシリアルポートを1つ使用する。
118シリアルポートの設定は
119 ・8ビット
120 ・パリティなし
121 ・ストップビット:1ビット
122 ・ボーレート:
123   京都マイクロコンピュータ(株)製のKZ-SH1-01:38400bps
124   (株)中央製作所製のμITRON搭載SH1CPUボード: 9600bps
125である。
126
127
1282.SH1プロセッサ依存部の機能
129
130この節では、カーネルおよびシステムサービスの機能の中で、SH1依存の部分
131について解説する。
132
1332.1 データ型
134
135signed int型,unsigned int型,size_t型のサイズは,いずれも32ビットであ
136る.
137
1382.2 割込み管理機能と割込みハンドラ
139
140カーネル管理外の割込みとしては、 NMI がある。よって、CPUロック状æ…
141‹ã‚„初
142期化ルーチン内
143では、NMI 以外の割込みはすべて禁止されている。å…
144·ä½“的には、
145IPM(Interrupt Priority Mask)が 15 に設定される。
146
147将来的にGDBスタブを利用することを考æ…
148®ã—て、ソースコード内
149に以下のよう
150な記述を含む。
151ボード上に NMI å…
152¥åŠ›ã‚’持たないターゲットのため、GDB のスタブがホストの
153マシンと通信するためのシリアルポートの優å…
154ˆåº¦ã‚’ 15 で登録し、GDB で
155Ctrl-C を押すと 割り込みがå…
156¥ã‚Šã‚¹ã‚¿ãƒ–に制御が移るようにしてある。この機
157能を使用するためにはCPUロック状æ…
158‹ã§ã¯ã€å„ªå…
159ˆåº¦ãŒ 14 になるようにしなけ
160ればならない。そのため、CPUロックで設定される優å…
161ˆåº¦ã‚’マクロ MAX_IPMで
162指定している。MAX_IPM はcpu_config.h の中で #define されている。スタブ
163を使う場合はMAX_IPMを14に、スタブを使わない場合はMAX_IPMを15に設定して
164いる。
165
166SH1依存の機能として、SR(Status Register)中の 割り込みマスクビット(I3〜
167I0)の値を変更するためのサービスコール chg_ipm と、参ç…
168§ã™ã‚‹ãŸã‚ã®ã‚µãƒ¼ãƒ“
169スコール get_ipm をサポートしている。なお、割り込みマスクビットの値を
170表すデータ型 IPM は、unsigned int型に定義されている。
171
172これらのサービスコールは、タスクコンテキストで CPUロック解除状æ…
173‹ã®å ´åˆ
174にのみ呼び出すことができる。chg_ipm により IPM を 0 以外(すなわち、何
175らかの割込みが禁止されている状æ…
176‹)にした場合でも、ディスパッチは禁止さ
177れず、chg_ipm により変更した IPM の値は、ディスパッチ後のタスクに引き
178継がれる。例えば、あるタスクで IPM を 1 に変更した後、何らかの割込みに
179より別のタスクに切り替わると、切り替わった後のタスクでもIPMは1になる。
180
181chg_ipm をサポートするために、割込みハンドラの出å…
182¥å£å‡¦ç†ãªã©ã«ã‚ªãƒ¼ãƒãƒ˜ãƒƒ
183ドを生じている。そこで、SUPPORT_CHG_IPM というマクロにより、これらのサー
184ビスコールをサポートするかどうかを切り替えられるようにしている。
185SUPPORT_CHG_IPM は、user_config.h の中で #define されている。
186
187SH1依存の割込みマスクの変更・参ç…
188§ã®ãŸã‚ã®ã‚µãƒ¼ãƒ“スコールの仕様は次の通
189り。
190
191(1) chg_ipm 割込みマスクの変更
192
193【C言語API】
194 ER ercd = chg_ipm(IPM ipm);
195
196【パラメータ】
197 IPM ipm 設定すべき IPM の値
198
199【リターンパラメータ】
200 ER ercd エラーコード
201
202【エラーコード】
203 E_CTX コンテキストエラー
204 E_PAR パラメータエラー(ipm が不正)
205
206【機能】
207
208IPM(Interrupt Priority Mask)を ipm で指定された値に設定する。指定した
209値が 0〜14ないし0〜13以外の場合、E_PARエラーとなる。IPM を0以外
210(1〜MAX_IPM-1)に設定した場合でも、ディスパッチは禁止されない。また、
211設定した IPM の値は、ディスパッチ後も引き継がれる。
212
213なお、このサービスコールを用いて、IPM を MAX_IPM (すべての割込みを禁止)
214に設定することはできない。IPM を MAX_IPM にしたい場合には、loc_cpu を
215使うべきである。
216
217このサービスコールは、タスクコンテキストで CPUロック解除状æ…
218‹ã®æ™‚のみ呼
219び出すことができる。非タスクコンテキストや CPUロック状æ…
220‹ã§å‘¼ã³å‡ºã—た場
221合には、E_CTXエラーとなる。
222
223(2) get_ipm 割込みマスクの参ç…
224§
225
226【C言語API】
227 ER ercd = get_ipm(IPM *p_ipm);
228
229【パラメータ】
230 なし
231
232【リターンパラメータ】
233 ER ercd エラーコード
234 IPM ipm 現在の IPM の値
235
236【エラーコード】
237 E_CTX コンテキストエラー
238
239【機能】
240
241現在の IPM(Interrupt Priority Mask)の値を読み出し、ipm に返す。
242
243このサービスコールは、タスクコンテキストで CPUロック解除状æ…
244‹ã®æ™‚のみ呼
245び出すことができる。非タスクコンテキストや CPUロック状æ…
246‹ã§å‘¼ã³å‡ºã—た場
247合には、E_CTXエラーとなる。
248
249
2502.3 CPU例外管理機能とCPU例外ハンドラ
251
252DEF_EXC で指定する割込みハンドラ番号(excno)は、SH1 での ベクタテーブル
253のベクタ番号を表し、そのデータ型(EXCNO)は unsigned int型に定義されてい
254る。DEF_EXC で、ベクタ番号として有効でない値や、CPU例外に対応しない番
255号を指定した場合の動作は保証されない。
256
257CPU例外ハンドラに渡されるp_excinfは、CPU例外発生時のコンテキストを保存
258したスタックへのポインタが渡される。スタックの構造を以下に示す。
259
260
261 ----------------------
262 | PR |
263 ----------------------
264 | R7 |
265 ----------------------
266 | R6 |
267 ----------------------
268 | R5 |
269 ----------------------
270 | R4 |
271 ----------------------
272 | R3 |
273 ----------------------
274 | R2 |
275 ----------------------
276 | R1 |
277 ----------------------
278 | R0 |
279 ----------------------
280 | PC |
281 ----------------------
282 | SR | <-- p_excinf
283 ----------------------
284
285 PR:Procedure Register
286 SR:Status Register
287 PC:Program Counter
288
289また、CPU例外発生時のPCの値はインクリメントされる。そのため、CPU例外ハ
290ンドラから復帰を行うと、CPU例外が発生した命令の次の命令から実行を再開
291する。
292
293
294
2952.4 スタートアップモジュール
296
297SH1依存のスタートアップモジュール(start.S)では、次の初期化処理を行う。
298
299(A) プロセッサモードの初期化とスタックポインタの初期化
300
301割り込みマスクを MAX_IPM に設定する。
302
303次に、スタックポインタ(r15)を STACKTOP に設定する。ここで割込みスタッ
304クポインタに設定されたスタック領域は、カーネル起動後は非タスクコンテキ
305スト用のスタック領域として使われる。STACKTOP は、user_config.h 部で定義
306することを想定している。
307
308(B) hardware_init_hook の呼出し
309
310hardware_init_hook が 0 でない場合には、hardware_init_hook を呼び出す。
311hardware_init_hook は、カーネルが起動される前に行う必
312要があるターゲッ
313ト依存の初期化を行うために用意している。hardware_init_hook がどこでも
314定義されていない場合、リンカでこのシンボルを 0 に定義する(リンカスク
315リプト内
316に記述あり)。
317
318(C) bssセクションと dataセクションの初期化
319
320bssセクションをゼロクリアする。また、dataセクションを初期化する。
321
322(D) software_init_hook の呼出し
323
324software_init_hook が 0 でない場合には、software_init_hook を呼び出す。
325software_init_hook は、カーネルが起動される前に行う必
326要があるソフトウェ
327ア環境(å…
328·ä½“的には、ライブラリ)依存の初期化を行うために用意している。
329software_init_hook がどこでも定義されていない場合、リンカでこのシンボ
330ルを 0 に定義する(リンカスクリプト内
331に記述あり)。
332
333(E) カーネルの起動
334
335kernel_start へ分岐し、カーネルを起動する。kernel_start からリターンし
336てくることは想定していない。
337
338
3392.5 割込み発生時のスタック消費量について
340
341以下の理由により、各タスクスタックはタスク自身が使用する分に加えて最大
342240バイト余分に用意する必
343要がある。
344
345JSPカーネルではタスクスタックの他に割込みスタックを用意し、非タスクコ
346ンテキストは割込みスタックで実行される。
347SH1は例外/割込み受付時に割込み禁止になる機構がハードウェアで用意されて
348いない。そのため、割込みのå…
349¥å£å‡¦ç†ã§ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã«ã‚ˆã£ã¦å‰²è¾¼ã¿ç¦æ­¢ã«ã™
350る必
351要がある。å…
352¥å£å‡¦ç†ã§ã¯å‰²è¾¼ã¿ç¦æ­¢ã«ç§»è¡Œã™ã‚‹ãŸã‚ã«ï¼ˆå‰²è¾¼ã¿è¨±å¯ã®çŠ¶æ…
353‹
354で)スタックにr0,r1を待
355避する。(SR(Status Register)とPC(Program
356Counter)は割込み受付け時にハードウェアが自動的に待
357避を行う。)
358このとき、多重割込みが発生すると割り込みスタックに切り替える前に同様の
359フレームがスタック上に生成される。SH1は割り込みレベルが15段あるので、
360最悪のタイミングで割込みが発生すると、スタックが240バイト消費される。
361(4バイト×4レジスタ×15セット)
362
363例外/割り込みのネスト回数のカウント用にカーネル内
364で変数intnestを用意
365し、非タスクコンテキストとタスクコンテキストの判別はこの変数により
366行っている。
367
368
3692.6 MACHとMACL (積和レジスタ)
370 MACH:Multiply and accumulate high register
371 MACL:Multiply and accumulate low register
372
373MACHとMACLについては、gccに-mhitachiオプションをつけると、関数でMACHと
374MACLを使用する場合、スタックに保存してから使用し、関数を抜けるとå…
375ƒã«æˆ»
376すため、割込みでは保存していない。また、自らディスパッチャを呼び出し、
377ディスパッチする場合は、関数呼び出しになるため、この呼び出しにまたがっ
378て、これらのレジスタを使うことはないため保存していない。そのためアセン
379ブラのコードを使用する場合もこのルールに従う必
380要がある。
381なお、割込みからのディスパッチ(受動的ディスパッチ)では保存している。
382
383
3842.7 GBR (Global Base Register)
385
386gccはGBRを使用しないため、割込みハンドラのå…
387¥å£ã§ã¯ä¿å­˜ã—ていない。割込
388みハンドラ内
389でGBRを使う場合はアプリケーション側でGBRの待
390避/保存を行う
391必
392要がある。また、上記のMACHとMACLと同じ理由により、自らディスパッチャ
393を呼び出す場合にも保存していない。なお、割込みからのディスパッチ(受動
394的ディスパッチ)では保存している。
395
396
397
3983.システム依存部の機能
399
4003.1 システムクロックドライバ
401
402システムクロックドライバが isig_tim を呼び出す周期は、user_config.h 中
403のTIC_NUME と TIC_DENO で定義されている(デフォルトでは 1ミリ秒周期)。
404この定義を変更することで、isig_tim を呼び出す周期を変更することができ
405る。
406ただし、タイマの精度が 1μ秒であるため、1μ秒単位で端数になる値を設定
407した場合には、isig_tim の呼出し周期に誤差が生じることになる。
408デフォルトではSH1の内
409蔵インテグレーテッド・タイマ・パルス・ユニット
410ITUのチャネル0を使用している。タイマハンドラの優å…
411ˆåº¦ã¯user_config.hで
412マクロTINTLVL0として定義している。(デフォルトでは4)
413
4143.2 性能評価用システム時刻参ç…
415§æ©Ÿèƒ½
416
417SH1依存部では、性能評価用システム時刻参ç…
418§æ©Ÿèƒ½(vxget_tim)をサポートして
419いる。性能評価用システム時刻の精度は 1μ秒単位であるが、タイマの現在値
420を読み出すために一時的にタイマを停止させる必
421要があるため、vxget_tim を
422呼ぶ度にシステムクロックが少しづつ遅
423れることになる。なお、SYSUTIM型は
424UD型(64ビットの符号無し整数型)に定義している。
425
4263.3 シリアルインタフェースドライバ
427
428シリアルインタフェースドライバは、SH1内
429蔵のSCI(Serial Communication
430Interface)のチャネル0をサポートしており、カーネルのログ出力用に使用
431している。シリアル割込みハンドラの優å…
432ˆåº¦ã¯é€å—信およびエラー割込みå…
433±
434にuser_config.hでマクロSCIINTLVLとして定義している。
435(デフォルトでは6)
436
437
4383.4 メモリマップ
439
440・京都マイクロコンピュータ(株)製のKZ-SH1-01
441・CQ出版(株)製のRISC評価キット SH-1
442
443この2つのボードはメモリマッピングが同じなので、依存部のソースコードは
444å…
445±é€šã§ã‚る。(CQ出版のボードは下記の「注意」の項
446を参ç…
447§ï¼‰
448依存部では、コード領域を 0x0000,0000 〜 0x0003,ffffの256KB、データ領域
449を0x0a00,0000 〜 の256KB、非タスクコンテキスト用のスタック領域を 〜
4500x0a03,ffff に確保している。
451
452注意
453 CQ出版のRISC評価キット SH-1はデフォルトの設定(8ビットバス、ROM1個)
454 では、アドレスバスの接続がシフトされている。そのため、ROMのアドレス
455 と実アドレスが一致しない。
456 付属のROMモニタ以外のユーザープログラムをROM化する場合は、アドレス
457 バスの設定を16ビット(ROM2個)に変更する必
458要がある。
459 (ボード付属のマニュアルp17を参ç…
460§ï¼‰
461
462・(株)中央製作所製のμITRON搭載SH1CPUボード
463メモリ実装
464タイプがFROM,SRAMそれぞれ2種類ある
465 FROM
466 ・0x0000,0000 - 0x0007,ffff コード領域(512KB)
467 ・0x0000,0000 - 0x0003,ffff コード領域(256KB)
468 SRAM
469 ・0x0200,0000 - データ領域(512KB)
470 - 0x0207,ffff 非タスクコンテキスト用のスタック領域
471 ・0x0200,0000 - データ領域(128KB)
472 - 0x0201,ffff 非タスクコンテキスト用のスタック領域
473ただしコード領域の0x0000,0000 〜 0x0000,ffffにFROM書込みプログラムを
474内
475蔵しているため、書換可能なコード領域は0x0001,0000 からとなっている。
476また、ROMICE使用時(S3スイッチON)は、実装
477FROMはエリア4(0x0400,0000 〜 )
478にマッピングされる。
479
4804.開発環境の構築
481
482開発環境の構築方法については、GNU開発環境構築マニュアルを参ç…
483§ã™ã‚‹ã“と。
484開発にはWindows2000 SP3 + Cygwinを用いた。
485動作確認したツールのバージョンは以下の通りである.
486 BINUTILS : 2.13.2.1
487 GCC-CORE : 2.95.3
488 NEWLIB : 1.8.1(京都マイクロコンピュータ(株)製KZ-SH1-01)
489        1.11.0((æ ª)中央製作所製 SH1CPUボード、下記参ç…
490§ï¼‰
491
492configure のオプションは--target=sh-hitachi-elfである。
493また、Windows上でCygwinを用いて開発する場合は、binutilsのconfigureのオ
494プションに --disable-nls も指定すること。
495
496備考
497  (株)中央製作所製 SH1CPUボードの動作確認の際にはnewlib1.11.0を用
498  いている。newlib1.11.0のmake時にエラーが発生するため、newlibディレ
499  クトリ下の「newlib/libc\machine/sh/memset.S」の1行目から9行目をコ
500  メントアウトしている。
501
502/*
503!
504! Fast SH memset
505!
506! by Toshiyasu Morita (tm@netcom.com)
507!
508! SH5 code by J"orn Rennecke (joern.rennecke@superh.com) <-- J"でエラー
509! Copyright 2002 SuperH Ltd.
510!
511*/
512
513
5145.制限事項
515
516
5175.1 システムインターフェースレイヤのsil_dly_nse()について
518
519本来はnsec単位の時間待
520ちを行う関数またはマクロであるが、実測したところ、
5211回の呼び出しで最低でも2240nsecもかかっているので、とてもnsec単位とは
522言えない状æ…
523‹ã§ã‚る。(動作速度が遅
524いデバイスにアクセスするための機能な
525ので問題はないと思われる。)
526 測定条件:
527  ボード:京都マイクロコンピュータKZ-SH1-01
528  クロック周波数:20MHz
529  バスステートコントローラの設定:
530    エリア0:リードサイクルでWAIT信号によるウェートステート挿å…
531¥ãªã—
532    エリア0,2:1ステートロングウェイト
533    エリア3:リードサイクルは1ステートで終了
534
5355.2 SIL_LOC_INT()について
536
537SH1版ではSIL_LOC_INT()の実装
538はCPUロックと同じ実現方法を用いている。
539(割込みロックがネストできる点はCPUロックと異なる。)そのため、
540SIL_LOC_INT()で割込み禁止している区間では、sns_loc()及びvxsns_loc()で
541CPUロック状æ…
542‹ã¨åˆ¤åˆ¥ã•ã‚Œã¦ã—まう。
543JSPカーネルではå…
544ƒã€…
545、割込みロック中にはサービスコールを使用できないと
546規定しているので、影響は少ないと思われる。
547(jsp/user.txtの「5.1.1 割込みロック状æ…
548‹ã®åˆ¶å¾¡ã€å‚ç…
549§ï¼‰
550
5515.3 gcc3.x対応について
552
553SH1版はgcc3.x系に対応していない。
554SH1ではmachレジスタが下位10ビットしか格納されないのに、処理系の不å…
555·åˆ
556により関数呼び出しの際に汎用レジスタの退避å…
557ˆã¨ã—て、作業レジスタに使わ
558れてしまう。そのため、レジスタの内
559容が復å…
560ƒã§ããªããªã‚Šã€å‡¦ç†ãŒç ´ç¶»ã™ã‚‹ã€‚
561これはJSPカーネルの有無に関係なく起こる現象であり、gccまたはbinutilsを
562修正しないと対応できない。
563(-ffixed-machオプションを試したが効果はなかった。)
564
5655.4 解決された制限事項
566
567
568以下の制限事項
569は解決されている。
570
5715.4.1 実行すべきタスクがない場合の割込み待
572ちについて
573
574ディスパッチャの出口で実行すべきタスクがない(schedtsk==NULL)場合は、
575sleep命令によってプロセッサを省電力モードに切り替えて割込み待
576ちをして
577いる。(cpu_sapport.Sのdispatcher_2付近を参ç…
578§ï¼‰
579
580割込み許可後にsleep命令を実行しているため、割込み許可命令の実行前に割
581込み要求がå…
582¥ã£ã¦ã„る場合(あるいは割込み許可直後、sleep命令実行前に割
583込み要求がå…
584¥ã£ãŸå ´åˆï¼‰ã€å‰²è¾¼ã¿è¨±å¯å‘½ä»¤ã®å®Ÿè¡Œã¨å…
585±ã«å‰²è¾¼ã¿ãŒå—け付けられ、
586その復帰後にsleepしたままになり、reqflgのチェックに進まない。
587(1msec以内
588にタイマ割込みがå…
589¥ã‚‹ãŸã‚ã€å®Ÿéš›ã«ã¯sleepしたままということは
590ない。)
591
592この問題は、割込みの許可とsleep 状æ…
593‹ã¸ã®ç§»è¡ŒãŒã‚¢ãƒˆãƒŸãƒƒã‚¯ã«å®Ÿè¡Œã§ããªã„
594ことに起因する。SH3以降ではIPMとは別にSRのBLビットを使って割込みの禁止
595/許可を制御することにより、この問題を回避できるが、SH1/2ではIPMを設定す
596る以外に割込みを禁止/許可する方法がなく、割込み許可(割込み待
597ちのIPM設
598定)とsleepをアトミックに行う方法がない。
599そこでSH1依存部では、割込み受付時にスタックに積まれた戻り番地を多重割込
600みの出口処理でチェックし、戻り番地が上記のsleep命令に該当する場合は戻り
601番地を1命令分(2バイト)進めることによりこの問題を回避している。
602ただし、この方法では多重割込みの出口処理に数命令のオーバーヘッドが生じる。
603OMIT_POWER_CONTROLマクロを定義することでsleep命令の代わりにnop命令が挿å…
604¥
605され、多重割込みの出口処理でのチェックルーチンは省略される。(この場合は
606消費電力の点で不利になる。)
607
6085.4.2 割込み/CPU例外の出å…
609¥å£å‡¦ç†ã«ã¤ã„て
610
611SH1では割込み受付直後に割込み禁止になっていないため、割込みAのå…
612¥å£å‡¦ç†
613中に別の割込みBがå…
614¥ã‚‹å¯èƒ½æ€§ãŒã‚る。(これはハードウェアのアーキテク
615チャ上避けようがない。)割込みハンドラB内
616でタスク切り替えを起こすよう
617なサービスコールを呼ぶと割込みBの出口処理で別のタスクにディスパッチし
618てしまい、タスク2からå…
619ƒã®ã‚¿ã‚¹ã‚¯ã«æˆ»ã£ã¦ãã‚‹ã¾ã§ã€å‰²è¾¼ã¿Aの処理が遅
620れて
621しまう。
622また、割込みAがレベルトリガだと2回検出されてしまう問題もある。
623これを防ぐため、スタックに積んである戻りå…
624ˆã®IPMとtask_intmaskの値を比
625較して、å…
626¥å£å‡¦ç†ä¸­ã«å‰²è¾¼ã¿ãŒå…
627¥ã‚‰ãªã‹ã£ãŸã‹ãƒã‚§ãƒƒã‚¯ã—ている。
628(cpu_support.Sの_ret_int参ç…
629§ï¼‰
630
631SH1ではCPU例外を受け付けても割込みマスクは変化しないため、CPU例外のå…
632¥
633口処理中に割込みがå…
634¥ã£ãŸå ´åˆã€ä¸Šè¨˜ã®ã‚ˆã†ãªåˆ¤åˆ¥æ–¹æ³•ã§ã‚‚対処できない。そ
635のため、割込みの出口処理でスタックに積まれた戻り番地とCPU例外のå…
636¥å£å‡¦
637理の番地を比較して、戻りå…
638ˆãŒCPU例外のå…
639¥å£å‡¦ç†ã‹å¦ã‹ã‚’判別処理をオプ
640ションで用意している。この処理はCPU例外を登録したテーブルをサーチする
641処理がå…
642¥ã‚‹ãŸã‚ã€å‰²ã‚Šè¾¼ã¿ç¦æ­¢åŒºé–“が長くなる。この判別処理を有効にしたい
643場合はマクロSUPPORT_CPU_EXC_ENTRY_CHECKを定義する。
644 タスクコンテキストで発生したCPU例外の処理は、後回しにされても割込み
645ほど問題はないと考え、上記の処理はデフォルトでは無効にしている。タスク
646コンテキストでのCPU例外がどのタスク内
647で発生するかは、割込みのようにタ
648イミングによるものではなく必
649然的なものである。そのため、CPU例外処理の
650優å…
651ˆé †ä½ã‚‚そのタスクに準じるものとして判断した。
652 例えば、タスク実行中にゼロ除算例外が発生して、その例外処理が遅
653れたと
654しても、他のタスクへの影響はない。(å…
655ƒã®ã‚¿ã‚¹ã‚¯ã«æˆ»ã£ã¦ãã‚‹ã¨ãã«ã¯ã€å¾…
656
657たされていた例外処理が行われるので、å…
658ƒã®ã‚¿ã‚¹ã‚¯ã«å¯¾ã—ても影響はない。)
659
660上記のテーブルはデフォルトでCPU例外を6要因登録できるようにしているが、
661アプリケーションでトラップ命令を使用し、カーネルでハンドリングする場合
662はuser_config.hのNUM_EXCの値を適宜変更する。
663
664
665
6666.その他
667
6686.1 ディレクトリ・ファイル構成
669
670SH1 ターゲット依存部の各ファイルの概要は次の通り。
671
672 config/sh1/
673 Makefile.config MakefileのSH1依存定義
674 cpu_defs.h プロセッサ依存部のアプリケーション用定義
675 cpu_config.h プロセッサ依存部の構成定義
676 cpu_config.c プロセッサ依存部の関数
677 cpu_support.S プロセッサ依存部のサブルーチン
678 cpu_context.h コンテキスト操作
679 cpu_insn.h 低レベルのプロセッサ操作ルーチン
680 cpu_rename.def カーネルの内
681部識別名のリネーム定義
682 cpu_rename.h カーネルの内
683部識別名のリネーム
684 cpu_unrename.h カーネルの内
685部識別名のリネーム解除
686 tool_defs.h 開発環境依存部のアプリケーション用定義(GNU開発環境用)
687 tool_config.h 開発環境依存部の構成定義(GNU開発環境用)
688 sh1.h SH1の定義
689 start.S スタートアップモジュール
690 vector_table.c 割込みベクタテーブル
691 sh1_sil.h SH1用アクセス・ユーティリティ
692 sh1itu.h SH1内
693蔵itu用タイマドライバ
694 sh1sci.c SH1内
695蔵sci用シリアルドライバ
696 sh1sci.h SH1内
697蔵sci用シリアルドライバ
698 util.h ユーティリティー・マクロの定義
699 makeoffset.c offset.h 生成サポートプログラム
700 shelf.ld リンカスクリプト
701
702
703 config/sh1/kz_sh1/
704 京都マイクロコンピュータ(株)製 KZ-SH1-01ボード依存部分
705 (CQ出版(株)製 RISC評価キットSH-1でも動作可能)
706
707 user_config.h ユーザー定義情
708å ±
709 Makefile.config MakefileのKZ-SH1-01ボード依存定義
710 sys_defs.h システム依存部のアプリケーション用定義
711 sys_config.h システム依存部の構成定義
712 sys_config.c システム依存部の関数
713 sys_support.S システム依存部のサブルーチン
714 sys_rename.def カーネルの内
715部識別名のリネーム定義
716 sys_rename.h カーネルの内
717部識別名のリネーム
718 sys_unrename.h カーネルの内
719部識別名のリネーム解除
720 hw_timer.h タイマ操作ルーチン
721 hw_serial.h SIOドライバ
722 hw_serial.cfg SIOドライバのコンフィギュレーションファイル
723 kz_sh1.h KZ-SH1-01のハードウェア定義
724
725
726 config/sh1/zunda_sh1/
727 (株)中央製作所製μITRON搭載SH1CPUボード依存部分
728
729 Makefile.config Makefileの中央製作所製 SH1CPUボード依存定義
730 sys_defs.h システム依存部のアプリケーション用定義
731 sys_config.h システム依存部の構成定義
732 sys_config.c システム依存部の関数
733 sys_support.h システム依存部のサブルーチン用定義
734 sys_support.c システム依存部のサブルーチン
735 sys_rename.def カーネルの内
736部識別名のリネーム定義
737 sys_rename.h カーネルの内
738部識別名のリネーム
739 sys_unrename.h カーネルの内
740部識別名のリネーム解除
741 hw_timer.h タイマ操作ルーチン
742 hw_serial.h SIOドライバ
743 hw_serial.cfg SIOドライバのコンフィギュレーションファイル
744 sh1sci2.c SH1内
745蔵sci用シリアルドライバ(2ch対応)
746 sh1sci2.h SH1内
747蔵sci用シリアルドライバ(2ch対応)
748 zunda_sh1.h.h 中央製作所製 SH1CPUボードのハードウェア定義
749 device.h LED,SW 制御関数の宣言
750 device.c LED,SW 制御関数
751
752
7536.2 ユーザーの設定項
754目
755
756SH1依存部では、ユーザーの設定項
757目をシステム依存部の2つのファイル
758Makefile.configとuser_config.hにまとめてあり、ユーザーはカーネル内
759部に
760立ちå…
761¥ã‚‰ãªãã¦ã‚‚、ある程度、設定を変更可能にしている。
762
7636.2.1 Makefile.configの設定項
764目
765
766・実行環境
767 変数DBGENVの設定により実行環境を選択する。
768  ・DBGENV=ROM:ROM化
769  ・DBGENV=GDB_STUB:GDB stub
770  ・DBGENV=PARTNER:京都マイクロコンピュータ製PARTNER-ET II
771   (中央製作所製 SH1CPUボード固有)
772    ROMICE使用時にNMIまでのROMベクタテーブルをベクタベースレジスタの
773    エリアへ転送する。
774    KERNEL_HAS_A_VECTOR_TABLEマクロ(後述)が定義されている場合のみ
775    有効である。
776  ・DBGENV=MULTI_STACK:ソフィアシステムズ製MultiSTAC-SH1
777    (京都マイクロコンピュータ(株)製KZ-SH1-01固有)
778
779・メモリマッピング
780  ・TEXT_START_ADDRESS:textセクションのå…
781ˆé ­ã‚¢ãƒ‰ãƒ¬ã‚¹
782  ・DATA_START_ADDRESS:dataセクションのå…
783ˆé ­ã‚¢ãƒ‰ãƒ¬ã‚¹
784
7856.2.2 user_config.hの設定項
786目
787
788user_config.h内
789で以下のマクロ定義を行うことにより、設定を変更できる。
790
791・SUPPORT_CHG_IPM
792  chg_ipm()を有効にする。
793  2.2節参ç…
794§
795
796・SUPPORT_VXGET_TIM
797  性能評価用システム時刻参ç…
798§æ©Ÿèƒ½vxget_tim()を有効にする。
799  3.2節参ç…
800§
801
802・SUPPORT_CPU_EXC_ENTRY_CHECK
803  割込みの出口処理で戻りå…
804ˆãŒCPU例外のå…
805¥å£å‡¦ç†ã§ã‚るかの
806  チェックを行う。
807  5.4.2節参ç…
808§
809
810・OMIT_POWER_CONTROL
811  実行すべきタスクがない場合の割込み待
812ちで省電力モードに移行しない。
813  (フルICE向けの設定)
814  5.4.1節参ç…
815§
816
817・FILL_STACK_WITH_0
818  デバッガでスタック領域を観察し易くするため、スタートアップルーチンで
819  非タスクコンテキストのスタック領域を0で初期化する
820
821・OMIT_DATA_SECTION_COPY
822  デバッグ環境によってはdataセクションの認識に不å…
823·åˆãŒã‚り、
824  __idata_start番地にダウンロードすべきデータを__data_start番地にダウン
825  ロードしてしまうものがある。その場合はOMIT_DATA_SECTION_COPYマクロを
826  定義してやることでスタートアップルーチンでのこのコピー作業を省略する。
827  
828・LARGE_TYPE(中央製作所製 SH1CPUボード固有)
829  SRAMメモリ実装
830タイプをラージタイプとする。
831
832・STACKTOP
833  非タスクコンテキスト用スタックの初期値
834
835・CONFIG_20MHZ
836・CONFIG_19MHZ
837・CONFIG_16MHZ
838  クロック周波数の切り替えを定義する。
839  上記の内
840、1つを選択する。
841
842・CONFIG_BAUD
843・CONFIG_BAUD_2
844  シリアル通信のボーレート(それぞれポート1,2に対応)
845  9600, 19200, 38400[bps]のいずれかを数値で定義する。
846
847・シリアルポート数の定義
848  ・TNUM_PORT
849    GDICレベルでサポートするシリアルポートの数
850    (カーネルの管理下にあるポート数)
851  ・TNUM_SIOP
852    PDICレベルでサポートするシリアルポートの数
853    (デバイスドライバ・レベルのポート数)
854  ・LOGTASK_PORTID
855    システムログに用いるシリアルポート番号
856
857・SCI_INTLVL
858  シリアル割込みの優å…
859ˆåº¦
860  3.3節参ç…
861§
862
863・TIMER_INTLVL
864  タイマ割込みの優å…
865ˆåº¦
866  3.1節参ç…
867§
868
869・TIC_NUME
870・TIC_DENO
871  タイマ割込みによりisig_tim()が呼び出される周期[msec]
872  それぞれ分子、分母を表す。
873  3.1節およびconfig.txtの
874   (3) タイムティックの定義
875  を参ç…
876§
877
878・NUM_EXC
879  上記のチェック対象となるCPU例外の登録数
880  デフォルトでは6要因としている。
881  SUPPORT_CPU_EXC_ENTRY_CHECKが定義されていない場合は無視される。
882  5.4.2節参ç…
883§
884
885・INNER_RAM_ADDRESS
886  プロセッサ内
887蔵RAMが利用できる場合はその最後尾のアドレスを
888  INNER_RAM_ADDRESSマクロとしてuser_config.hで定義する。
889  このマクロが定義されている場合は、スタックポインタをこの値に設定し
890  てhardware_init_hook()を呼び出すので、hardware_init_hook()をC言語
891  で記述することができる。(つまり、INNER_RAM_ADDRESSはスタックポイ
892  ンタの一時的な初期値として使用される。)
893  hardware_init_hook()から戻った後でスタックポインタをSTACKTOPに再設
894  定している。
895  KERNEL_HAS_A_VECTOR_TABLEマクロが定義されている場合のみ有効である。
896 
897 備考
898  一般にC言語の関数呼び出しはスタックを使用するので、バスコントローラ
899  の初期化前に関数呼び出しはできない。INNER_RAM_ADDRESSマクロを定義す
900  ることでhardware_init_hook()をC言語で記述できるようになる。
901
902・CPU例外ハンドラのå…
903ˆé ­ã‚¢ãƒ‰ãƒ¬ã‚¹
904  以下のマクロはすべて省略可能である。
905  省略した場合はデフォルトの値として、スタートアップルーチンのå…
906ˆé ­
907  アドレスが使用される。
908
909・NMI_VECTOR
910  NMI例外ハンドラのå…
911ˆé ­ã‚¢ãƒ‰ãƒ¬ã‚¹
912  デフォルト値:スタートアップルーチンのå…
913ˆé ­ã‚¢ãƒ‰ãƒ¬ã‚¹
914  KERNEL_HAS_A_VECTOR_TABLEマクロが定義されている場合のみ有効である。
915
916・GII_VECTOR
917  一般不当命令例外ハンドラのå…
918ˆé ­ã‚¢ãƒ‰ãƒ¬ã‚¹
919  デフォルト値:スタートアップルーチンのå…
920ˆé ­ã‚¢ãƒ‰ãƒ¬ã‚¹
921  KERNEL_HAS_A_VECTOR_TABLEマクロが定義されている場合のみ有効である。
922
923・SII_VECTOR
924  スロット不当命令例外ハンドラのå…
925ˆé ­ã‚¢ãƒ‰ãƒ¬ã‚¹
926  デフォルト値:スタートアップルーチンのå…
927ˆé ­ã‚¢ãƒ‰ãƒ¬ã‚¹
928  KERNEL_HAS_A_VECTOR_TABLEマクロが定義されている場合のみ有効である。
929
930・CAE_VECTOR
931  CPUアドレスエラー例外ハンドラのå…
932ˆé ­ã‚¢ãƒ‰ãƒ¬ã‚¹
933  デフォルト値:スタートアップルーチンのå…
934ˆé ­ã‚¢ãƒ‰ãƒ¬ã‚¹
935  KERNEL_HAS_A_VECTOR_TABLEマクロが定義されている場合のみ有効である。
936
937・DAE_VECTOR
938  DMAアドレスエラー例外ハンドラのå…
939ˆé ­ã‚¢ãƒ‰ãƒ¬ã‚¹
940  デフォルト値:スタートアップルーチンのå…
941ˆé ­ã‚¢ãƒ‰ãƒ¬ã‚¹
942  KERNEL_HAS_A_VECTOR_TABLEマクロが定義されている場合のみ有効である。
943
944
945
9466.3 カーネル移植者
947向けの情
948å ±
949
9506.3.1 内
951部的に使用されているマクロ
952以下のマクロはSH1依存部で条件コンパイルを行うために内
953部的に使用してる
954ものであり、ユーザーが定義する必
955要はない。
956
957・GDB_STUB
958  GDB stubサポート時のため、予約している。
959
960・KERNEL_HAS_A_VECTOR_TABLE
961  例外ベクタをカーネルが管理する。
962  GDB stubやモニタプログラムが例外ベクタを管理する場合は、このマクロ
963  を定義しない。
964
965・SIO_RESERVED
966  シリアル・コミュニケーション・インターフェースSCIの1chをデバッガ等
967  が使用している。
968  このマクロが定義されるとカーネルはSCI 1chを使用しない。
969
970
9716.3.2 ルネサステクノロジ製純正Cコンパイラに移植する場合の注意点
972 ディスプレースメント付きレジスタ間接の記述が異なるので注意が必
973要である。
974  該当箇所(cpu_support.S)
975   ・TCB構造体へのアクセス
976   ・割込み/CPU例外の出口処理におけるタスクコンテキストの割込み
977    マスクの引き継ぎ
978 
979  ルネサステクノロジ純正アセンブラの@(disp,Rn)
980   アクセスサイズ 実効アドレスの計算式
981   バイト Rn + disp → EA
982   ワード Rn + disp×2 → EA
983   ロングワード Rn + disp×4 → EA
984
985  gasの@(disp,Rn)
986   アクセスサイズ 実効アドレスの計算式
987   バイト Rn + disp → EA
988   ワード Rn + disp → EA(但しdispは2n)
989   ロングワード Rn + disp → EA(但しdispは4n)
990
991
992変更履歴
993
9942010年 6月24日
995・修正
996 + cpu_insn.hのset_sr(), cpu_defs.hの_disint_()
997  + インラインアセンブラ(ldc rn, sr命令)のclobber変数
998   リストにmemoryとSRのTビットを追加
999
1000
10012005年11月14日 Release1.4.2
1002・修正
1003 + cpu_config.cの_dummy_memcpy( )
1004  + string.hにあるmemcpy( )の一般的なプロトタイプ宣言に合わせる
1005   void *memcpy(void *dest, const void *src, size_t len);
1006   
1007 + 引数なしの関数定義
1008  + 明示的にvoidを付けた。
1009
1010
10112005年9月14日
1012・改良
1013 + zunda_sh1/sys_support.h
1014  + ポートA・拡張I/O定義見直し
1015 + インラインアセンブラの文法エラーを修正
1016  + cpu_config.hのdefine_inh()
1017  + kz_sh1/kz_sh1.hのgdb_stub_putc()
1018 + macレジスタの退避/復å…
1019ƒç®‡æ‰€ã®è¦‹ç›´ã—
1020   gcc3.xへの対応を試みるが、動作せず。
1021   (詳細は5.3節を参ç…
1022§ï¼‰
1023   
1024   修正前:
1025    割込みによるタスクスイッチのみ
1026   修正後:
1027    ・割込みハンドラ呼び出し前
1028    ・能動的なディスパッチャ呼び出しによるタスクスイッチ前
1029
1030
10312004年10月9日 Release1.4.1
1032
1033・バグフィックス
1034 + 割込みのå…
1035¥å£å‡¦ç†ä¸­ã«åˆ¥ã®å‰²è¾¼ã¿ãŒå…
1036¥ã‚‹å ´åˆã«æœ€åˆã®å‰²è¾¼ã¿ãŒã‚¿ã‚¹ã‚¯ã‚ˆã‚Š
1037  処理が後回しにされる不å…
1038·åˆã‚’修正(CPU例外についても同様)
1039 + 実行すべきタスクがないときの割込み待
1040ちで、タイミングによっては
1041  割込み処理後にsleepしたままになる不å…
1042·åˆã‚’修正
1043・改良
1044 + サポートボードの変更
1045  + 中央製作所製μITRON搭載SH1CPUボードを追加
1046  + 常盤商行 SH1/CPUBを削除
1047 + 割込み/CPU例外の出å…
1048¥å£å‡¦ç†ãƒ«ãƒ¼ãƒãƒ³ã‚’要因毎に展開する部分を見直し、
1049  ROM消費量を削減した。(1割込み要因当たり126バイト削減)
1050 + GDB stubに対応
1051 + ROM-ICE向けに例外ベクタの実装
1052方法を修正
1053  + NMI等の例外ベクタをボード依存部で定義できるようにした
1054 + SILのアクセス関数の名称をガイドライン準拠に変更
1055 + INNER_RAM_ADDRESSマクロの導å…
1056¥ã«ã‚ˆã‚Šhardware_init_hook()をC言語で
1057  記述できるようにスタートアップルーチンを修正
1058 + ユーザーが変更できる箇所をuser_config.hとして分離した。
1059
10602003年12月24日 Release1.4
1061
1062・バグフィックス
1063 + 実行すべきタスクがなくて割込み待
1064ちをする際、runtskをクリアしていない
1065  ため、タイミングによってはiget_tid()の戻り値が正しくない不å…
1066·åˆã‚’修正
1067 + vxget_tim()で1msec以下の端数が正しくなかった不å…
1068·åˆã‚’修正
1069
1070・その他の改良
1071 + ファイルの依存関係のå…
1072¨é¢çš„な見直し
1073 + シリアルドライバとタイマドライバをITRONデバイスドライバガイドライン
1074  準拠に修正
1075 + シリアルドライバに受信エラー割込みハンドラを追加
1076
10772002年4月15日 Release1.3
1078
1079・バグフィックス
1080 + 初期化時の割込み/CPU例外ネストカウンタの値の修正
1081 + 割込み出口処理での割込みマスクの設定処理の追加
1082
1083・その他の改良
1084 + 標準ライブラリのmemcpyをリンクする場合としない場合の両方に対応
1085
10862001年11月20日 Release1.2
1087
1088・バグフィックス
1089 + ベクタテーブルのコピーの際、領域のサイズを間違えていた
1090  バグを修正
1091
1092・その他の改良
1093  + 機種依存部とå…
1094±é€šéƒ¨ã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã®å¤‰æ›´ã«è¿½å¾“
1095  + 実行できるタスクが1つもないときの挙動を変更
1096   (chg_ipm()との整合)
1097
1098
10992001年5月10日 Release1.1
1100
1101SH1版のサポートを開始
Note: See TracBrowser for help on using the repository browser.