= TOPPERS/JSPカーネル ユーザズマニュアル = (SH3/SH4 ターゲット依存部) (Release 1.4.2対応,最終更新: 11-Jul-2005) ------------------------------------------------------------------------ TOPPERS/JSP Kernel Toyohashi Open Platform for Embedded Real-Time Systems/ Just Standard Profile Kernel Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory Toyohashi Univ. of Technology, JAPAN 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation によって公表されている GNU General Public License の Version 2 に記 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, 利用と呼ぶ)することを無償で許諾する. (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 権表示,この利用条件および下記の無保証規定が,そのままの形でソー スコード中に含まれていること. (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 の無保証規定を掲載すること. (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 用できない形で再配布する場合には,次のいずれかの条件を満たすこ と. (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 作権表示,この利用条件および下記の無保証規定を掲載すること. (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに 報告すること. (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. 本ソフトウェアは,無保証で提供されているものである.上記著作権者お よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. @(#) $Id: sh3.txt,v 1.36 2005/09/26 06:26:36 honda Exp $ ------------------------------------------------------------------------ 1.SH3/SH4 ターゲット依存部の概要 1.1 ターゲットシステムと開発環境 SH3/SH4 プロセッサのターゲットシステムとしては,SH7709A,SH7729R, SH7727,SH7750を搭載した以下のボードをサポートしている.なお,SH3-DSP の DSP 機能,SH4 の FPU はサポートしていない.(ディスパッチ時及び割込 みの入り口で関連するレジスタを保存していない) ・(株)日立超LSIシステムズ製の MS7709ASE01 ボード (CPU: SH7709A) ・(株)日立超LSIシステムズ製の MS7729RSE01 ボード (CPU: SH7729R) ・(株)日立超LSIシステムズ製の MS7750SE01 ボード (CPU: SH7750) ・(株)日立超LSIシステムズ製の MS7727CP01 ボード (CPU: SH7727) なお,MS7709ASE01,MS7729RSE01,MS7750SE01は,ハードウェア構成が似通っ ているため, solution_engine という名前のシステム依存部としてまとめて いる.切り替えは,システム依存部の Makefile.clonfig で指定する.以下, これら3種類のボードを特に区別しない場合は,Solution Engine と表記する. 開発環境には,GCC などの GNU開発環境を用い,オブジェクトファイルフォー マットは ELF を標準とする. Solution Engine では実行環境として,GDBスタブを用いる方法と JTAG-ICE を用いる方法をサポートする.GDBスタブは Toppers プロジェクトのホームペー ジからダウンロード可能である.JTAG-ICEとしては,京都マイクロコンピュー タ製のPARTNER-Jでの動作を確認している.GDBスタブを用いる場合には, Makefile 中で,DBGENV に GDB_STUB を設定する(デフォルト).PARTNER-J を用いる場合には,DBGENVに PARTNER_J を設定する. MS7727CP01 では,T-Monitor を用いる方法とJTAG-ICEを用いる方法をサポート する.なお,T-Monitor を使ってデバッグすることは不可能であり,単なるロー ダーとして用いる.具体的には,カーネルをSレコードに変換し,T-Monitor でダウンロードして実行する.カーネル終了時は,プロセッサをリセットする. 1.2 サポートする機能の概要 SH3 依存の機能として,割込みマスクの変更・参照(chg_ixx,get_ixx)と,性 能評価用システム時刻参照機能(vxget_tim)をサポートしている.割込みの禁 止と許可(dis_int,ena_int)はサポートしていない. 1.3 他のターゲットへのポーティング 現バージョンでは,SH7708 を用いたシステム依存部は存在しない.しかしな がら,プロセッサ依存部のコード自体は SH7708 をサポートする.そのため, SH7708をサポートするシステム依存部を作成することは容易である.その場合 には,コンパイルオプションもしくは sys_defs.h で SH7708 を定義すればよ い. 1.4 シリアルポート カーネルのログ出力用として,Solution Engine ではスーパーI/O内蔵 SCI(CN3)を 19200bps で使用する.MS7727CP01 では,CPUボード上のシリアル インタフェースコネクタを 115200bps で使用する.なお,全てのポートにお いて データ: 8bit,Parity:none,Stop:1bitである. 1.5 エンディアン 各ターゲットはディップスイッチによりエンディアンを変更することが可能で ある.これに合わせて,カーネルのエンディアンの設定は各システム依存部で 変更可能である.エンディアンは以下の個所で設定する. ・システム依存部の Makefile.config コンパイルオプション -ml or -mb リンカオプション -ml or -mb リンカスクリプト shlelf.ld or shelf.ld ・システム定義 SIL_ENDIAN SIL_ENDIAN_LITTLE or SIL_ENDIAN_BIG 2.SH3 プロセッサ依存部の機能 この節では,カーネルおよびシステムサービスの機能の中で,SH3依存の部分 について解説する. 2.1 データ型 int型および unsigned int型のサイズは 32ビットである. 2.2 割込み管理機能と割込みハンドラ カーネル管理外の割込みとしては, NMI がある.よって,CPUロック状態や初 期化ルーチン内では,NMI 以外の割込みはすべて禁止されている.具体的には, IPM(Interrupt Priority Mask)が 15 に設定される.しかしながら,ボード上 に NMI 入力を持たないターゲットのため,GDBスタブがホストのマシンと通信 するためのシリアルポートの優先度を 15 で登録し,GDB で Ctrl-C を押すと 割り込みが入りスタブに制御が移るようにしてある.この機能を使用するため にはCPUロック状態では,優先度が 14 になるようにしなければならない.そ のため,CPUロックで設定される優先度をマクロで MAX_IPM で指定している. MAX_IPM はcpu_config.h の中で定義されている.GDBスタブを使う場合は 14 にGDBスタブを使わない場合は 15 に設定している. DEF_INH で指定する割込みハンドラ番号(inhno)は,SH7708/50 では,割り込 み事象レジスタ(INTEVT)に設定されるコードであり,SH7709A/09/29R/27 では, 割り込み事象レジスタ2(INTEVT2)に設定されるコードである.データ型 (INHNO)は unsigned int型に定義されている.DEF_INH で,INTEVT,INTEVT2コー ドとして有効でない値や,外部割込みに対応しない番号を指定した場合の動作 は保証されない. SH3依存の機能として,SR(Status Register)中の 割り込みマスクビット(I3〜 I0)の値を変更するためのサービスコール chg_ipm と,参照するためのサービ スコール get_ipm をサポートしている.なお,割り込みマスクビットの値を 表すデータ型 IPM は,unsigned int型に定義されている. これらのサービスコールは,タスクコンテキストで CPUロック解除状態の場合 にのみ呼び出すことができる.chg_ipm により IPM を 0 以外(すなわち,何 らかの割込みが禁止されている状態)にした場合でも,ディスパッチは禁止さ れず,chg_ipm により変更した IPM の値は,ディスパッチ後のタスクに引き 継がれる.例えば,あるタスクで IPM を 1 に変更した後,何らかの割込みに より別のタスクに切り替わると,切り替わった後のタスクでも IPM は 1 にな る. chg_ipm をサポートするために,割込みハンドラの出入口処理などにオーバヘッ ドを生じている.そこで,SUPPORT_CHG_IPM というマクロにより,これらのサー ビスコールをサポートするかどうかを切り替えられるようにしている. SUPPORT_CHG_IPM は,cpu_config.h の中で #define されている. SH3依存の割込みマスクの変更・参照のためのサービスコールの仕様は次の 通り. (1) chg_ipm 割込みマスクの変更 【C言語API】 ER ercd = chg_ipm(IPM ipm); 【パラメータ】 IPM ipm 設定すべき IPM の値 【リターンパラメータ】 ER ercd エラーコード 【エラーコード】 E_CTX コンテキストエラー E_PAR パラメータエラー(ipm が不正) 【機能】 IPM(Interrupt Priority Mask)を ipm で指定された値に設定する.指定した 値が 0〜13ないし14以外の場合,E_PARエラーとなる.IPM を 1〜MAX_IPM -1 に設定した場合でも,ディスパッチは禁止されない.また,設定した IPM の 値は,ディスパッチ後も引き継がれる. なお,このサービスコールを用いて,IPM を MAX_IPM (すべての割込みを禁止) に設定することはできない.IPM を MAX_IPM にしたい場合には,loc_cpu を 使うべきである. このサービスコールは,タスクコンテキストで CPUロック解除状態の時のみ呼 び出すことができる.非タスクコンテキストや CPUロック状態で呼び出した場 合には,E_CTXエラーとなる. (2) get_ipm 割込みマスクの参照 【C言語API】 ER ercd = get_ipm(IPM *p_ipm); 【パラメータ】 なし 【リターンパラメータ】 ER ercd エラーコード IPM ipm 現在の IPM の値 【エラーコード】 E_CTX コンテキストエラー 【機能】 現在の IPM(Interrupt Priority Mask)の値を読み出し,ipm に返す. このサービスコールは,タスクコンテキストで CPUロック解除状態の時のみ呼 び出すことができる.非タスクコンテキストや CPUロック状態で呼び出した場 合には,E_CTXエラーとなる. 2.3 CPU例外管理機能とCPU例外ハンドラ DEF_EXC で指定する割込みハンドラ番号(excno)は,SH3 での 例外事象レジス タに設定される例外コード番号を表し,そのデータ型(EXCNO)は unsigned int 型に定義されている.DEF_EXC で,例外コード番号として有効でない値や, CPU例外に対応しない番号を指定した場合の動作は保証されない. CPU例外ハンドラに渡されるp_excinfは,CPU例外発生時のコンテキストを保存 したスタックへのポインタが渡される.スタックの構造を以下に示す. offset ---------------------- | R7 | <-- p_excinf ---------------------- 1 | R6 | ---------------------- 2 | R5 | ---------------------- 3 | R4 | ---------------------- 4 | R3 | ---------------------- 5 | R2 | ---------------------- 6 | R1 | ---------------------- 7 | R0 | ---------------------- 8 | MACH | ---------------------- 9 | MACL | ---------------------- 10 | GBR | ---------------------- 11 | SR | ---------------------- 12 | PR | ---------------------- 13 | PC | ---------------------- また,CPU例外発生時のPCの値は発生例外要因に応じてCPUによりインクリメン トされる場合や,されずにリトライする場合がある.そのため,PCの値を変更 したい場合は,CPU例外ハンドラで,p_excinfを元にPCの値を変更すればよい. 2.4 スタートアップモジュール SH3依存のスタートアップモジュール(start.S)では,次の初期化処理を行う. (A) プロセッサモードの初期化とスタックポインタの初期化 最初に,すべてのキャッシュを無効化した後,キャッシュをライトスルーモー ドに設定し,有効にする.また,プロセッサのモードを,特権モード,レジス タバンク1に設定し,割り込みマスクを MAX_IPM に設定する. 次に,スタックポインタ(r15)を STACKTOP に設定する.ここで割込みスタッ クポインタに設定されたスタック領域は,カーネル起動後は非タスクコンテキ スト用のスタック領域として使われる.STACKTOP は,sys_config.h 部で定義 することを想定している. (B) hardware_init_hook の呼出し hardware_init_hook が 0 でない場合には,hardware_init_hook を呼び出す. hardware_init_hook は,カーネルが起動される前に行う必要があるターゲッ ト依存の初期化を行うために用意している.hardware_init_hook がどこでも 定義されていない場合,リンカでこのシンボルを 0 に定義する(リンカスク リプト内に記述あり). (C) bssセクションと dataセクションの初期化 bssセクションをゼロクリアする.また,dataセクションを初期化する. (D) software_init_hook の呼出し software_init_hook が 0 でない場合には,software_init_hook を呼び出す. software_init_hook は,カーネルが起動される前に行う必要があるソフトウェ ア環境(具体的には,ライブラリ)依存の初期化を行うために用意している. software_init_hook がどこでも定義されていない場合,リンカでこのシンボ ルを 0 に定義する(リンカスクリプト内に記述あり). (E) カーネルの起動 kernel_start へ分岐し,カーネルを起動する.kernel_start からリターンし てくることは想定していない. 2.5 レジスタバンク 例外ハンドラの入口を除き基本的にレジスタバンク0を使用している.レジス タバンク1は r7 のみ例外/割り込みのネスト回数のカウント用に使用している. 非タスクコンテキストとタスクコンテキストの判別はこのレジスタにより行っ ている.なお,スタブはレジスタバンク1のR0とR1を使用するため,このレジ スタに書き込んだデータはスタブが呼び出されると破壊される. 2.6 MACH,MACL,GBR gccでは,MACH,MACL,GBRはすべてスクラッチレジスタとして扱われるため, 関数呼び出しの前後では値は保証されない.そのため,例外/割込み発生時に は,スクラッチレジスタである汎用レジスタR0〜R7と同様に保存している. また,自らディスパッチャを呼び出しす場合は,関数呼び出しになるため,保 存していない.アセンブラのコードを使用する場合もこのルールに従う必要が ある. 2.7 割込みハンドラ実行時の割込みマスク SH3は割込み発生時,割込みマスクビット(I3〜I0)はプロセッサによって自動 的に設定されないため,ソフトウェアによって設定する必要がある.割込みハ ンドラ実行時に設定する割込みマスクビットをカーネルに指定するサービスコー ルとしてdefine_int_plevel() を用意している.このサービスコールの使用は 次の通り.なお,define_int_plvel()により割込みマスクビットを指定しなけ れば割込みハンドラはディフォルトの MAX_IPM -1 のマスクで実行される. define_int_plevel 割込みハンドラ実行時の割込みマスクビットの指定 【C言語API】 void define_int_plevel(UINT dintno, UW plevel) 【パラメータ】 dintno 割込み番号 plevel 割込みレベル 【機能】 dintno で指定した割込み番号の割込みハンドラが実行される場合の割込み マスクを plevel にする. 3.システム依存部の機能 3.1 システムクロックドライバ システムクロックドライバが isig_tim を呼び出す周期は,sys_defs.h 中の TIC_NUME と TIC_DENO で定義されている(標準は 1ミリ秒周期).この定義 を変更することで,isig_tim を呼び出す周期を変更することができる.ただ し,タイマの精度が 1μ秒であるため,1μ秒単位で端数になる値を設定した 場合には,isig_tim の呼出し周期に誤差が生じることになる. 3.2 性能評価用システム時刻参照機能 SH3依存部では,性能評価用システム時刻参照機能(vxget_tim)をサポートして いる.性能評価用システム時刻の精度は 1μ秒単位であるが,タイマの現在値 を読み出すために一時的にタイマを停止させる必要があるため,vxget_tim を 呼ぶ度にシステムクロックが少しづつ遅れることになる.なお,SYSUTIM型は UD型(64ビットの符号無し整数型)に定義している. 3.3 シリアルインタフェースドライバ Solution_Engine のシリアルインタフェースドライバは,スーパーI/O内蔵 SCI(CN3) をサポートしている.また,MS7727CP01のシリアルインタフェース ドライバは,ST16C2550CQ48 をサポートしている. 3.4 メモリマップ コード領域とデータ領域は各システム依存部の Makefile.config で,スタッ クの初期値は,sys_defs.h で設定する. ・Solution Engine コード領域を 0x0c003000 〜 0x0c0fffff 約1MB,データ領域を 0x0c100000 〜 の約3MB,非タスクコンテキスト用のスタック領域を 〜0x0c3fffff に確 保している.0x0c000000 〜 0x0c000fff は,GDBスタブのワークエリアとなっ ており,使用することができない. ・MS7727CP01 コード領域を 0x0c003000 〜 0x0c0fffff 約1MB,データ領域を 0x0c100000 〜 の約3MB,非タスクコンテキスト用のスタック領域を 〜0x0c3fffff に確 保している.0x0c000000 〜 0x0c002fff は,ROMモニタのワークエリアとなっ ており,使用することができない. 4.開発環境の構築 開発環境の構築方法については,GNU開発環境構築マニュアルを参照のこと. 4.1 開発環境のバージョン 動作確認したツールのバージョンは以下の通りである. BINUTILS : 2.10.1 GCC-CORE : 2.95.3 GDB : 4.18 NEWLIB : 1.9.0 の組み合わせもしくは BINUTILS : 2.14 GCC-CORE : 3.3 GDB : 5.3 NEWLIB : 1.11.0 5.その他 5.1 ディレクトリ・ファイル構成 SH3 ターゲット依存部の各ファイルの概要は次の通り. config/sh3/ Makefile.config Makefileの SH3 依存定義 cpu_defs.h プロセッサ依存部のアプリケーション用定義 cpu_config.h プロセッサ依存部の構成定義 cpu_config.c プロセッサ依存部の関数 cpu_support.S プロセッサ依存部のサブルーチン cpu_context.h コンテキスト操作 cpu_rename.def カーネルの内部識別名のリネーム定義 cpu_rename.h カーネルの内部識別名のリネーム cpu_unrename.h カーネルの内部識別名のリネーム解除 tool_defs.h 開発環境依存部のアプリケーション用定義(GNU開発環境用) tool_config.h 開発環境依存部の構成定義(GNU開発環境用) makeoffset.c offset.h 生成サポートプログラム cpu_insn.h 低レベルのプロセッサ操作ルーチン start.S スタートアップモジュール shelf.ld ビッグエンディアン用リンカスクリプト shlelf.ld リトルエンディアン用リンカスクリプト hw_timer.h タイマ操作ルーチン sh3.h SH3 の定義 sh4.h SH4 の定義 config/sh3/solution_engine Makefile.config Makefileの Solution Engine 依存定義 ms7709ase01.h MS7709ASE01 ハードウェア定義 ms7729rse01.h MS7729RSE01 ハードウェア定義 ms7750se01.h MS7750SE01 ハードウェア定義 solution_engine.h Solution Engine共通定義 sys_config.c システム依存部の関数 sys_config.h システム依存部の構成定義 sys_defs.h システム依存部のアプリケーション用定義 sys_support.S システム依存部のサブルーチン sys_rename.def カーネルの内部識別名のリネーム定義 sys_rename.h カーネルの内部識別名のリネーム sys_unrename.h カーネルの内部識別名のリネーム解除 hw_serial.h SIOドライバ hw_serial.cfg SIOドライバのコンフィギュレーションファイル config/sh3/ms7727cp01 Makefile.config Makefileの MS7727CP01 依存定義 ms7727cp01.h MS7727CP01 ハードウェア定義 sys_config.c システム依存部の関数 sys_config.h システム依存部の構成定義 sys_defs.h システム依存部のアプリケーション用定義 sys_support.S システム依存部のサブルーチン sys_rename.def カーネルの内部識別名のリネーム定義 sys_rename.h カーネルの内部識別名のリネーム sys_unrename.h カーネルの内部識別名のリネーム解除 hw_serial.h SIOドライバ hw_serial.cfg SIOドライバのコンフィギュレーションファイル pdic/simple_sio/ st16c2550.h ST16C2550 の定義 st16c2550.c ST16C2550 用SIOドライバ fdc37c935a.h fdc37c935a の定義 fdc37c935a.c fdc37c935a 用SIOドライバ