= TOPPERS/JSPカーネル ユーザズマニュアル = (H8Sターゲット依存部 (H8C(HEW)対応版)) (Release 1.4.4対応,最終更新: 29-Dec-2010) ------------------------------------------------------------------------ TOPPERS/JSP Kernel Toyohashi Open Platform for Embedded Real-Time Systems/ Just Standard Profile Kernel Copyright (C) 2000-2004 by Embedded and Real-Time Systems Laboratory Toyohashi Univ. of Technology, JAPAN Copyright (C) 2001-2007 by Industrial Technology Institute, Miyagi Prefectural Government, JAPAN Copyright (C) 2001-2004 by Dep. of Computer Science and Engineering Tomakomai National College of Technology, JAPAN 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation によって公表されている GNU General Public License の Version 2 に記 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, 利用と呼ぶ)することを無償で許諾する. (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 権表示,この利用条件および下記の無保証規定が,そのままの形でソー スコード中に含まれていること. (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 の無保証規定を掲載すること. (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 用できない形で再配布する場合には,次のいずれかの条件を満たすこ と. (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 作権表示,この利用条件および下記の無保証規定を掲載すること. (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに 報告すること. (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. 本ソフトウェアは,無保証で提供されているものである.上記著作権者お よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. @(#) $Id: h8s-renesas.txt,v 1.2 2007/03/23 07:27:55 honda Exp $ ------------------------------------------------------------------------ 1. H8Sターゲット依存部の概要 1. 1 ターゲットシステムと開発環境  本実装はgcc対応だったH8S依存部を(株)ルネサス ソリューションズ製の開 発環境H8C(HEW)に対応させたものである。 H8Sプロセッサのターゲットシステムは、H8S/2339Fを搭載した以下のボード である。 ・株式会社ミスポ製 MiNET-H8S/2339F (H8S/2339F搭載) 本実装は以下のモードで使用することを前提としている。  CPU動作モード:アドバンスドモード  割込み制御モード2 他のモードで使用する場合は、アセンブラ部分を修正する必要がある。 1. 2 サポートする機能の概要 性能評価用システム時刻参照機能 (vxget_tim)、割込みマスクの変更・参照 (chg_ipm、 get_ipm)をサポートしているが、 割り込みの禁止と許可 (dis_int、ena_int) はサポートしていない。 1. 3 他のターゲットへのポーティング H8S/2000シリーズであれば、ポーティングは容易に出来ると思われる。 1. 4 シリアルポート (SCI) H8S/2000シリーズにはSCI0〜SCI1(SCI2)の2本(3本)のシリアルポートが あり、user_config.hに定義しているTNUM_PORTにより何本使用するか指定でき る。現在の実装では3本まで使用できる。(下記の注意を参照) JSP カーネルのログ出力用にはSCI1を使用している。 注意:  MiNET-H8S/2339Fでは、SCI0がH-UDIデバッグポートと競合している、SCI0の コネクタが実装されていない等の理由により、SCI0の動作確認はしていない。 シリアルポートの設定を以下に示す。 ・ボーレート   38400[bps] ・データ長    8ビット ・ストップビット 1ビット ・パリティなし 2. H8S プロセッサ依存部の機能 カーネルとシステムサービス機能の中で、H8S依存の部分について解説する。 2. 1 データ型 int型とunsigned int型のサイズは 16ビットである。また、処理系の制約か ら、64ビット整数はサポートしていない。 2. 2 割込み管理機能と割込みハンドラ 本実装では割込み制御モード2のみをサポートしている。 (割込みモード0についてはH8と互換なので、H8ターゲット依存部 (H8C(HEW) 対応版)が参考になると思われる。) user_config.hとuser_config.incで定義されるMAX_IPMマクロにより、カーネ ルが管理する割込みレベルが変更できる。 IPM:Interrupt Priority Mask (処理系の仕様により、定義ファイルが2つあるので注意)   カーネル管理下の割込み = 割込みレベルがMAX_IPM 以下の割込み   カーネル管理外の割込み = プライオリティレベル(MAX_IPM+1)                以上の割込みとNMI 初期化ルーチン内ではNMI以外の割込みはすべて禁止されているのに対して、 CPUロック状態ではカーネル管理下の割込みのみが禁止されている。 (「カーネル管理外の割込み」についてはμITRON4.0仕様書を参照) 具体的には、CPUロック状態ではEXRレジスタのIビットにMAX_IPMの値をセット し、さらにカーネル内のフラグ変数をセットしている。 DEF_INHで指定する割込みハンドラ番号(inhno)は,H8Sでの例外ベクタ番号を 表し,そのデータ型(INHNO)はunsigned int型に定義されている. DEF_INHで,例外ベクタ番号として有効でない値や,外部割込みに対応しない 番号を指定した場合の動作は保証されない. 2.2.1 割込みハンドラの登録方法 jsp-1.4.1 H8S依存部(gcc版)では、割込みベクタテーブルを手動で編集して いたが、これをコンフィギュレーション時にDEF_INH( )の引数から自動生成す るよう仕様変更している。 割込みハンドラを登録する作業手順  タイマ割込みを例に説明する。  (1) 割込みハンドラの記述    割込み要求をクリアする処理が必要な場合は割込みハンドラのC言語    ルーチン、またはそこから呼ばれる関数内に記述する方法を標準と    する。    タイマ割込みでの記述例:     jsp/systask/timer.c       timer_handler( )から呼び出されるhw_timer_int_clear( )       (jsp/config/h8s-renesas/hw_timer.h)  (2) コンフィギュレーション・ファイルの記述    コンフィギュレーション・ファイルの記述方法は他のプロセッサと同様    である。    ベクタ番号はjsp/config/h8-renesas/h8s2xxxf.hでマクロ定義している。    DEF_INH( )の第1引数の割込みハンドラ番号はプリプロセス後に整数定数    になっていなければならない。(自動割り付け非対応整数値パラメータ)    ベクタテーブル自動生成時もそれを仮定している。    タイマ割込みでの記述例:     jsp/systask/timer.cfg     DEF_INH(INHNO_TIMER, { TA_HLNG, timer_handler });  (3) 割込みプライオリティレベルの設定    初期化処理のcpu_initialize( )ですべての割込みをレベル0に初期化し    ている。    デバイスドライバの初期化処理で割込み要因毎のプライオリティ・レベ    ルを設定するための関数が用意されている。         【C言語API】      void icu_set_ilv( UH ipr, BOOL mask, INT level )    【パラメータ】 UH ipr 設定するインタラプトプライオリティレジスタの アドレスの下位16ビット ( IPRA - IPRK マクロで設定 ) BOOL mask 設定するインタラプトプライオリティレジスタの 設定範囲(上位部分または下位部分)の選択 ( IPR_UPR、または、IPR_LOW マクロで設定 ) INT level 設定する割込みレベル ( 0 - 7 )    【リターンパラメータ】      なし    【機能】      インタラプトプライオリティレジスタの各例外要因別に、割込みレベル      設定を行う。      この関数を呼び出す前にcpu_config.hをインクルードする必要がある。    【タイマ割込みでの記述例】      jsp/config/h8s-renesas/hw_timer.h       hw_timer_initialize( )       icu_set_ilv( IPRF, IPR_UPR, TPU0_INT_LVL );    設定に用いる値はマクロ定義されている。        ・IPRA〜IPRKレジスタのアドレス     jsp/config/h8s-renesas/h8s2339f.h #define IPRA 0xfec4 #define IPRB 0xfec5 #define IPRC 0xfec6 #define IPRD 0xfec7 #define IPRE 0xfec8 #define IPRF 0xfec9 #define IPRG 0xfeca #define IPRH 0xfecb #define IPRI 0xfecc #define IPRJ 0xfecd #define IPRK 0xfece 2.2.2 割込みマスクの変更・参照 H8S依存の機能として,EXRレジスタ中のIPMの値を変更するためのサービスコー ルchg_ipmと,参照するためのサービスコールget_ipmをサポートしている. なお,IPMの値を表すデータ型IPMは,unsigned char型に定義されている. これらのサービスコールは,タスクコンテキストでCPUロック解除状態の場合 にのみ呼び出すことができる.chg_ipmによりIPMをレベル0以外(すなわち, 何らかの割込みが禁止されている状態)にした場合でも,ディスパッチは禁止 されず,chg_ipmにより変更したIPMの値は,ディスパッチ後のタスクに引き継 がれる. 例えば,あるタスクでIPMをレベル1に変更した後,何らかの割込みにより別の タスクに切り替わると,切り替わった後のタスクでもIPMはレベル1になる. chg_ipmをサポートするために,割込みハンドラの出入口処理などにオーバ ヘッドを生じている.そこで,SUPPORT_CHG_IPMというマクロにより,これら のサービスコールをサポートするかどうかを切り替えられるようにしている. SUPPORT_CHG_IPMは,user_config.hおよびuser_config.incの中でマクロ 定義されている. H8S依存の割込みマスクの変更・参照のためのサービスコールの仕様は次の通り. (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 で指定された値に設定する. IPMに指定した値が0〜MAX_IPMの範囲外の場合,E_PARエラーとなる.IPM を0 以外に設定した場合でも,ディスパッチは禁止されない.また,設定したIPM の値は,ディスパッチ後も引き継がれる.ディスパッチを禁止したい場合には, dis_dspと併用すればよい. なお,このサービスコールを用いて,IPMをMAX_IPM(カーネル管理の割込みを すべて禁止)に設定しても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例外ハンドラ H8Sプロセッサ自体にCPU例外を扱う機能が備わっていないため、カーネルのH8S 依存部もCPU例外をサポートしていない。従って、CPU 例外ハンドラの設定関 数 define_exc( )は何もしない関数である。 他機種との互換性のため、CPU例外ハンドラ番号のデータ型 (EXCNO) は unsigned int型に定義されている。 2. 4 スタートアップモジュール H8S依存のスタートアップモジュール (start.src) は次に示す初期化を実行し た後、カーネル (kernel_start) を起動する。ただし、 kernel_start から戻っ てくることは想定していない。 (1) スタックポインタの設定 (2) ハードウェア依存の初期化処理の呼出し       HARDWARE_INIT_HOOKマクロが定義されていれば、ハードウェア依      存の初期化処理を呼出す。このルーチンはカーネルを起動する前に、      ターゲット依存のハードウェア的な初期化を行うために用意し、そ      のラベル名をHARDWARE_INIT_HOOKマクロとして定義する。      HARDWARE_INIT_HOOKマクロの定義はsys_config.incで行うのを      標準とする。      また、HARDWARE_INIT_HOOKを呼び出す時点でRAMが使用できない場合      に対応するため、関数呼び出しではなくjmp命令を使用している。      従って、HARDWARE_INIT_HOOKから戻ってくるときもrts命令ではなく、      jmp命令を用いる。その際の戻り先番地のラベルは_clear_b_section      である。 (3) Bセクションの初期化 Bセクションの全領域を 0 クリアする。 (4) Dセクションの初期化 Dセクションを外部 RAM に転送する。 (5) ソフトウェア環境依存の初期化処理の呼出し       SOFTWARE_INIT_HOOKマクロが定義されていれば、ソフトウェア環      境依存の初期化処理を呼出す。この関数はカーネルを起動する前に、      ソフトウェア環境(ライブラリ等)依存の初期化を行うために用意す      る。例えば、ライブラリの初期設定などである。      その関数名をSOFTWARE_INIT_HOOKマクロとして定義する。      SOFTWARE_INIT_HOOKマクロの定義はsys_config.incで行うのを      標準とする。 2. 5 割込み発生時のスタック使用量について H8Sでは割込み受付時にハードウェアによって割込みマスクの設定が行われ るが割込み禁止になっていない。そのため、割込みの入口処理(カーネル)で 割込み禁止操作を行うが、その前に多重割込みが入る可能性がある。  割込みの入口処理で割込み禁止前にタスクスタックに積まれる内容   ・戻り番地   ・CCRレジスタ   ・EXRレジスタ(+リザーブ領域1バイト)   ・er0〜er3     計 22バイト      また、割込みの出口処理でタスクスイッチする場合はer4からer6の12バイトも タスクスタックに積まれる。 (その後、元のタスクに戻ってくる際に、タスク例外処理ルーチンが起動され る場合はさらにタスクスタックの領域が必要になる。) MAX_IPMを7に設定した場合、最高7つの割込みがネストする。そのすべてが上 記の割込み禁止前に受け付けられた場合、2つ目以降の割込みもスタック切り 替え前のタスクスタックにレジスタが退避される。このときのタスクスタック の消費量は    22バイト×7レベル + 12バイト = 116バイト となる。    3. システム依存部の機能 3. 1 システムクロックドライバ システムクロックドライバが isig_tim を呼出す周期は、 user_config.h内 のTIC_NUME と TIC_DENO で定義されており、ディフォルトは 1[ms] 周期であ る。 この定義を変更することで、isig_tim を呼出す周期を変更できる。 ただし、 タイマ精度の単位で端数になる値を設定すると、 isig_tim の呼出し周期に誤 差が発生する。 【MiNET-H8S/2339F】 タイマに供給されているクロック周波数は6144[kHz]であり (クロック24.576[MHz]の4分周)、タイマ精度は  (1,000,000/6144)[nsec]=約0.163[μsec] である。 ディフォルトのクロックデバイスとして、H8S/2339FではTPU(16bitタイマ)を 使用している。 3. 2 性能評価用システム時刻参照機能 H8Sでは、性能評価用システム時刻参照機能 (vxget_tim) をサポートしてい る。 【C言語API】   ER vxget_tim(SYSUTIM *p_sysutim); 【パラメータ】 なし 【リターンパラメータ】 SYSUTIM sysutim:リセットからの経過時間(μsec単位) 【エラーコード】 E_CTX:非タスクコンテキストから呼び出した 【機能】 リセットからの経過時間をμsec単位で計測し、実行性能の計測機能を提供す る。SYSUTIM型は UW型(32 ビット符号なし整数型)であるため、μsec単位で換 算するとリセットから約71分間毎にオーバーフローして、ゼロに戻る。2点間 の実行時間を計測するときにこのオーバーフローが発生していないか注意が必 要である。 【MiNET-H8S/2339F】 タイマ自体の精度は約0.163[μsec]であり、1μsec単位まで有効である。 3. 3 シリアルインタフェースドライバ H8S/2339Fには SCI0〜SCI2 の 3 本のシリアルポートがあり、 user_config.h に定義している TNUM_PORT により何本使用するか指定できる。 現在の実装では 3本まで使用できる。 JSP カーネルのログ出力用には SCI1 を使用している。 シリアルのポート番号とデバイス番号の対応は以下の通りである。  ・ポート1:SCI0  ・ポート2:SCI1  ・ポート3:SCI2 注意:  MiNET-H8S/2339Fでは、SCI0がH-UDIデバッグポートと競合している、SCI0の コネクタが実装されていない等の理由により、SCI0の動作確認はしていない。 3. 4 メモリマップ 3. 4. 1 MiNET-H8S/2339Fのメモリマップ (1) デバッグモード(JTAGデバッグ使用時)  モード4  内蔵ROM無効モード  外部RAMをCS0空間に配置  外部バス幅:16ビット 0x00,0000 - 0x00,ffff 外部RAM 1MB              ベクタテーブル、P,C,Dセクション              R(D),Bセクション 0xff,7c00 - 0xff,fbff 内蔵RAM 32KB              非タスクコンテキスト用スタックエリア   デバッグモードでは、プログラムをRAM上にダウンロードして実行するこ   とを想定している。そのため、ダウンロード前にデバッグツールを用いて   バスステートコントローラの初期化を行う必要がある。   バスステートコントローラの設定例についてはボード付属のマニュアル   p10 「4.4 レジスタ設定例」やsys_support.srcを参照 (2) リリースモード(ROM化)  モード6  内蔵ROM有効モード  外部RAMをCS1空間に配置  外部バス幅:16ビット 0x00,0000 - 0x03,ffff 内蔵ROM 384kB 設定によっては0x06,ffffまで使用できる。              ベクタテーブル、P,C,Dセクション 0x20,0000 - 0x2f,ffff 外部RAM 1MB              R(D),Bセクション 0xff,7c00 - 0xff,fbff 内蔵RAM 32KB              非タスクコンテキスト用スタックエリア 4. サンプルプログラムの実行手順 4. 1 開発環境 開発環境は、Windows 2000上で、(株)ルネサス ソリューションズ製の開発 環境を用いた。  本開発に用いたツールのバージョンを以下に示す。 ・コンパイラ、アセンブラ、最適化リンケージエディタ   型番:R0C40008XSW06R   バージョン:V.6.1.2 ・統合開発環境 HEW4.02.00.022 また、他にも下記のツールが必要になる。 ・MinGW コンフィギュレータをビルドするために必要となる。 通常は既にコンパイル済みのものが用意されているため,そちらを 利用すればよい. MinGW (Minimalist GNU for Windows) http://www.mingw.org/ http://sourceforge.net/projects/mingw/ (インストーラの入手先) ・Windowsのコマンド・プロンプトで動作するPerl   下記の4.3 (1)の作業で使用する。   Active Perl v5.8.8  配布元 http://www.ActiveState.com 4. 2 コンフィギュレータのビルド user.txt を参照のこと。 4. 3 サンプルプログラムのビルド (1) 環境設定  Perlのインタプリタへのパス設定を行う。 (2) HEW上でのビルド ワークスペース・ファイルを開く  jsp/tools/H8S-RENESAS/H8S-RENESAS.hws  ワークスペース作成時とディレクトリが異なる旨の警告が出るが無視する。    ※ ツールチェーンのバージョンが異なる旨の警告が出る場合    上記のバージョンより古いツールチェーンでの動作は未確認である。 このワークスペースには4つのプロジェクトが登録されている。  ・offset:TCB構造体内のオフセットを求める。       カーネルソースコードをAPI毎にコピーする。  ・libkernel:カーネル・ライブラリのビルドを行う。  ・configuration:カーネル・コンフィギュレーション、ベクタテーブルの           自動生成を行う。  ・sample:サンプル・アプリケーションのビルドを行う。 プロジェクトの依存関係のため、以下の順番でビルドする。  1.libkernelプロジェクトをアクティブプロジェクトに設定する  2.libkernelプロジェクトをビルドする  3.sampleプロジェクトをアクティブプロジェクトに設定する  4.sampleプロジェクトをビルドする 手順1と2は最初の1回のみでよく、アプリケーション部分のみソー スコードを変更した場合はリビルドする必要はない。 configurationプロジェクトとoffsetプロジェクトは依存プロジェ クトとして自動的にビルドされる。 sampleプロジェクトのビルドが成功すると、  ・実行ファイル sample1.abs  ・Sレコードファイル sample1.mot が生成されるよう設定してある。 注意:  libkernelのビルドより先にoffsetプロジェクトをビルドする必要があるが、 プロジェクト間の依存関係を設定してもsampleプロジェクトを起点とした場合 (依存関係がネストしている場合)は正しい順序で実行されないので、手動で libkernelプロジェクトを予めビルドしておく。 (3) ターゲット・ボードのダウンロード ボードやデバッグツールのマニュアルを参照。 5. ファイル構成 5. 1 ディレクトリ・ファイル構成 (1) config/h8s-renesas/ cpu_config.c H8Sプロセッサ依存部のC関数 cpu_config.h H8Sプロセッサ依存部の構成定義 cpu_config.inc  上記のアセンブラ用定義 cpu_context.h H8Sプロセッサ依存部のコンテキスト操作 cpu_defs.h H8Sプロセッサ依存部のアプリケーション用定義 cpu_insn.h H8Sプロセッサの特殊命令の関数定義 cpu_support.src H8Sプロセッサのアセンブリ関数 cpu_rename.def カーネルの内部識別名のリネームとその解除の          定義リスト cpu_unrename.h カーネルの内部識別名のリネーム解除の定義 cpu_rename.h カーネルの内部識別名のリネームの定義 cpu_unrename.h カーネルの内部識別名のリネーム解除の定義 cpu_rename.inc  上記のアセンブラ用定義 h8s.h H8Sプロセッサの共通定義 h8s2339f.h H8S/2339Fプロセッサの定義 h8s2339f.inc 上記のアセンブラ用定義 h8s_sil.h   H8S内部レジスタアクセスルーチン h8s_sil.h   DDRレジスタアクセスルーチン start.src スタートアップモジュール tool_config.h H8Sプロセッサの開発環境依存モジュール定義 tool_defs.h H8Sプロセッサの開発環境依存定義 makeoffset.c offset.inc生成サポート用ソースファイル vector_header.src 割込みベクタテーブルのヘッダー部分 util.h   ビット番号などの定義 util.inc    上記のアセンブラ用定義 hw_serial.cfg SCIのコンフィギュレーションファイル hw_serial.h SCIの構成定義 hw_serial.c SCIの関数定義 h8s_sci.h    シリアルドライバ(PDIC) h8s_sci.c    シリアルドライバの関数定義 hw_timer.h TPUの構成定義 h8s_tpu.h    タイマドライバ(PDIC) (2) config/h8s-renesas/minet_h8s_2339f/ (株)ミスポ MiNET-H8S/2339Fボードの依存部分 minet_h8s_2339f.h MiNET-H8S/2339Fボード依存の定義 sys_config.c MiNET-H8S/2339Fボード依存部のC関数 sys_config.h MiNET-H8S/2339Fボード依存部の構成定義 sys_config.inc  上記のアセンブラ用定義 sys_defs.h MiNET-H8S/2339Fボード依存部のアプリケー          ション用定義 sys_support.src MiNET-H8S/2339Fボード依存部のアセンブリ関数 sys_rename.def カーネルの内部識別名のリネームとその解除の          定義リスト sys_rename.h カーネルの内部識別名のリネームの定義 sys_unrename.h カーネルの内部識別名のリネーム解除の定義 sys_tool_defs.h デバッグ環境依存の定義 以下は、ユーザーが編集する必要があるファイル user_config.h  ユーザー・コンフィギュレーション情報の定義 user_config.inc 上記のアセンブラ用定義 (3) utils/     ビルドに必要なユーティリティ群  h8/      gcc版と共通のスクリプト  grep_def_inh.pl  Perlスクリプト生成用フィルタ  h8-renesas/ H8C依存のスクリプト(H8プロセッサと共通)  copy_kernel_source.bat           カーネルのソースコードをAPI毎にコピー           するバッチファイル  genoffset    TCB構造体内のオフセットを算出する           perlスクリプト  genvector.pl   ベクタテーブル生成用スクリプト  h8s-renesas/ H8C依存のスクリプト  gen_intentry.pl 割込み入口処理生成用スクリプト (4) tools/H8S-RENESAS/ HEW4.0用のワークスペース・ディレクトリ  (株)ミスポ MiNET-H8S/2339F readme.txt  ビルド手順を示したreadmeファイル H8S-RENESAS.hws  ワークスペース・ファイル sample1.cfg  サンプル・アプリケーションのコンフィギュレーション  ファイル sample1.c  サンプル・アプリケーションのC言語ソース・ファイル sample1.h  サンプル・アプリケーションのインクルード・ファイル (5) tools/H8S-RENESAS/offset/     以下の処理を行うプロジェクト・ディレクトリ      ・TCB構造体内のオフセット算出      ・カーネル・ソースコードをAPI毎にコピー      call_copy_kernel_source.bat   copy_kernel_source.batを呼び出すためのバッチファイル call_genoffset.bat   genoffsetスクリプトを呼び出すためのバッチファイル      Debug/ デバッグ用ビルドディレクトリ       offset.inc  TCB構造体内のオフセット定義ファイル      Release/ デバッグ用ビルドディレクトリ       offset.inc  TCB構造体内のオフセット定義ファイル (6) tools/H8S-RENESAS/libkernel/     カーネル・ライブラリのビルドを行うプロジェクト・ディレクトリ     kernel_source/   中間ファイルを格納するディレクトリ (7) tools/H8S-RENESAS/configuration     カーネル・コンフィギュレーションを行うプロジェクト     ディレクトリ      call_configuration.bat  コンフィギュレータを呼び出すためのバッチファイル      Debug/ デバッグ用ビルドディレクトリ       kernel_id.h    ID自動割付けの定義ファイル       debug_kernel_cfg.c コンフィギュレータの出力結果       debug_vector.src 自動生成された割込みベクタテーブル      Release/ デバッグ用ビルドディレクトリ       kernel_id.h    ID自動割付けの定義ファイル       relase_kernel_cfg.c コンフィギュレータの出力結果       release_vector.src 自動生成された割込みベクタテーブル (8) tools/H8S-RENESAS/sample     サンプル・アプリケーションのビルドを行うプロジェクト・ディレクトリ      6. アプリケーション開発者向けの情報 アプリケーション開発者に有益と思われる情報について述べる。 6.1 カーネルの設定変更方法 H8S依存部では、様々な設定変更が容易にできるよう、設定箇所をを以下の2つ のファイルにまとめている。  ・user_config.h  C言語向け設定ファイル  ・user_config.inc アセンブラ言語用設定ファイル ユーザーはこの2つのファイル内のマクロ定義を変更するだけで、カーネルの ソースファイルを読まなくてもある程度までカーネルの設定を変更できる。 設定項目によってはC言語用とアセンブラ言語用の両方の定義が必要になるの で注意。 以下、設定ファイル内の各マクロの意味を述べる。 ・全般的な設定項目 (1) SUPPORT_CHG_IPM chg_ipmをサポートするかどうかの定義 設定ファイル:user_config.h、user_config.inc (2) SUPPORT_VXGET_TIM vxget_timをサポートするかどうかの定義 この設定を変更した場合は、ファイル分割を再度行う必要がある。 設定ファイル:user_config.h (3) STACKTOP 非タスクコンテキスト用スタックポインタの初期値 設定ファイル:user_config.inc (4) MAX_IPM カーネルが管理する割込みの最高優先レベル   カーネル管理下の割込み = 割込みレベルがMAX_IPM 以下の割込み   カーネル管理外の割込み = プライオリティレベル(MAX_IPM+1)                以上の割込みとNMI 設定ファイル:user_config.h, user_config.inc ・シリアルポート関連の設定項目 (1) TNUM_PORT、TNUM_SIOP サポートするシリアルデバイスの数(最大 3) TNUM_PORT : シリアルドライバ(serial.c)、つまり GDICレベルでサポート       するシリアルポートの数 TNUM_SIOP : PDICレベル(プロセッサ内蔵SIO)でサポートするシリアルI/O        ポートの数(現在の実装では最大3) 設定ファイル:user_config.h 以下、ポート2の設定はTNUM_PORTを2に設定した場合のみ有効である。 (同様にポート3の設定はTNUM_PORTを3に設定した場合のみ有効である。) (2) BAUD_RATE0、BAUD_RATE1、BAUD_RATE2 SCI0, SCI1, SCI2のボーレート [bps] 設定ファイル:user_config.h (3) SCI0_INT_LVL、SCI1_INT_LVL、SCI2_INT_LVL SCI0, SCI1, SCI2の割込みプライオリティ・レベル 設定ファイル:user_config.h (4) LOGTASK_PORTID システムログを出力するシリアルポート番号 設定ファイル:user_config.h (5) POL_PORTID 低レベル出力(ポーリング出力)に用いるシリアルポート番号 設定ファイル:user_config.h (6) OMIT_SCI0 このマクロが定義されるとシリアルドライバからSCI0が省略される。 MiNET-H8S/2339F依存部ではデフォルトでこのマクロを定義している。 設定ファイル:sys_tool_defs.h ・タイマ関連の設定項目 (1) TIC_NUME、TIC_DENO タイムティックの周期の分子、分母 設定ファイル:user_config.h (2) TPU0_INT_LVL タイマ割込みTPU0のプライオリティ・レベル 設定ファイル:user_config.h ・実行環境に関する定義  以下のマクロは開発環境のアセンブラ・オプションとして定義するのを  標準とする。  (デバッグビルドとリリースビルドで切り替える。) (1) RAM デバッグ環境でプログラムがRAM上にダウンロードされるか否かの定義 このマクロが定義されている場合はスタートアップルーチンでバスステートコ ントローラの初期化をスキップする。 (2) USE_DEBUGGER このマクロが定義されている場合はデバッガ上で実行することを意味し、exr のTビットを考慮する。 6.2 アプリケーション向けに提供される機能 H8S依存部ではアプリケーションを開発しやすくするため、以下の機能を提供し ている。 6.2.1 微少時間待ち 機種非依存部のsil.hでプロトタイプ宣言しているsil_dly_nse関数は引数が UINT型であり、int型が2バイトであるこの処理系では約65μsecまでしか表現 できない。これより長い時間待ちを行うため、引数をUW型に変更した別関数 sil_dly_nse_longを用意している。どちらもnsec単位で待ち時間を指定する。 t_services.hやs_services.hをインクルードすることにより(cpu_defs.hを介 して)利用できる。 【C言語API】   void sil_dly_nse_long(UW dlytim); 【パラメータ】 UW dlytim    待ち時間[nsec] 【リターンパラメータ】 なし 【エラーコード】 なし 【機能】 ソフトウェア・ループにより時間待ちを行う。 同様の機能を提供するsil_dly_nse関数は最大約65μsecまで待ち時間を指定で きるのに対して、sil_dly_nse_long関数は約4.3secまで指定できる。 6.2.2 I/OポートのDDRレジスタへのアクセス補助機能 H8SのI/Oポートのデータ・ディレクション・レジスタDDRは書き込み専用であり、 そのままでは所望のビットだけを変更することができない。 (bset,bclr命令でも回避不可) また、カーネルのスタートアップルーチンでもいくつかのDDRレジスタに対し て設定を行っているため、そのままではカーネルとアプリケーションの間で整 合性を保つことができない。 そのため、本実装では、メモリ上にテンポラリを用意して、DDRの現在値を保 持する方法を採っている。ポート番号はIO_PORT_ID型にtypedefされており、 IO_PORT1〜IO_PORTGののいずれかを指定する。(ポート4は入力専用のため、 DDRレジスタがないので欠番としている。)ポート番号として、これら以外の 値を指定した場合はassert文でエラーとなる。 (1) sil_reb_ddr  DDRレジスタの読み出し 【C言語API】   UB sil_reb_ddr(IO_PORT_ID port); 【パラメータ】 IO_PORT_ID port    ポート番号 【リターンパラメータ】 DDRレジスタの値 【エラーコード】 なし 【機能】 portで指定されるポート番号のDDRレジスタの値を読み出す。 (2) sil_wrb_ddr  DDRレジスタへの書き込み 【C言語API】   void sil_wrb_ddr(IO_PORT_ID port, UB data); 【パラメータ】 IO_PORT_ID port   ポート番号 UB data     書き込む値 【リターンパラメータ】 なし 【エラーコード】 なし 【機能】 portで指定されるポート番号のDDRレジスタに値dataを書き込む。 (3) sil_anb_ddr  DDRレジスタのAND演算 【C言語API】   void sil_anb_ddr(IO_PORT_ID port, UB data); 【パラメータ】 IO_PORT_ID port   ポート番号 UB data     AND演算を行う値 【リターンパラメータ】 なし 【エラーコード】 なし 【機能】 portで指定されるポート番号のDDRレジスタに対して、値dataとのAND演算を 行う。 (4) sil_orb_ddr  DDRレジスタのOR演算 【C言語API】   void sil_orb_ddr(IO_PORT_ID port, UB data); 【パラメータ】 IO_PORT_ID port   ポート番号 UB data     AND演算を行う値 【リターンパラメータ】 なし 【エラーコード】 なし 【機能】 portで指定されるポート番号のDDRレジスタに対して、値dataとのOR演算を 行う。 7. カーネル移植者向けの情報  H8S依存部を他のターゲット・ボードへを移植する際に必要な情報を以下に 述べる。 7.1 マクロ定義 (1) HARDWARE_INIT_HOOK スタートアップルーチンからハードウェア依存の初期化処理を呼び出すときは、 その先頭アドレスをマクロ定義する。 (GNU ldのPROVIDE命令と同等の機能がないため) 定義ファイル:sys_config.inc (2) SOFTWARE_INIT_HOOK スタートアップルーチンからソフトウェア環境(特にライブラリ)依存の処理を 呼び出すときは、その先頭アドレスをマクロ定義する。 定義ファイル:sys_config.inc (3) SOFTWARE_TERM_HOOK atexit( )から呼び出す処理が外部定義されている場合は、その関数名をマクロ 定義する。atexit( )では  ・外部定義があれば、それを呼び出す ・外部定義がなければ、何もしない(空の定義) 定義ファイル:sys_config.h (4) H8S_BASE_ADDR 内蔵レジスタのアドレスの上位2バイト 将来、CPU動作モードをノーマルモードにもできるよう拡張性を持たせている。 定義ファイル:sys_config.inc (5) SIL_DLY_TIM1, SIL_DLY_TIM2 sil_dly_nse_longsで用いる定数 定義ファイル:sys_config.inc (6) SYS_SYSCR SYSCRの初期値 定義ファイル:minet_h8s_2339f.h (7) CPU_CLOCK プロセッサに供給されるクロック周波数 [Hz] 設定ファイル:minet_h8s_2339f.h (8) TIMER_CLOCK タイマに供給されるクロック周波数[kHz] 設定ファイル:minet_h8s_2339f.h 以下のシリアル関連のマクロ定義は、クロック周波数とボーレートから決まる 値であり、アプリケーションプログラマから隠蔽するため、minet_h8s_2339f.h で定義している。 (user_config.hに入れると、ユーザーにとって煩雑になる。) (9) BRR0_RATE, BRR1_RATE シリアルポートのBRRレジスタ値 (10) SCR0_CKS, SCR1_CKS SCRレジスタのCKS0,CKS1ビット (12) DDRアクセスルーチンのための定数定義 (a) DDRレジスタのアドレス DDRレジスタのアドレスを以下のマクロ名P1DDR〜PGDDRで定義する。 定義ファイル:sys_config.hからインクルードされるファイル        h8s2xxxf.hで定義するのを標準とする。 (b) DDRレジスタの初期値 スタートアップルーチン実行直後のDDRレジスタの値をマクロ名 P1DDR0〜PGDDR0で定義する。 定義ファイル:minet_h8s_2339f.h 7.2 ビルド用のスクリプトについて (a) jsp/tools/H8S-RENESAS/configuration/call_configurator.bat HEWでは、(ワークスペース・ディレクトリの外にある)外部ツールを相対パ ス指定で呼び出せないため、このようなバッチファイルを介して、  ・コンフィギュレータ  ・Perlスクリプト を呼び出している。 以下のxxxの部分を移植の際に変更する必要がある。  ・システム依存部のディレクトリ名    cfg.exe -s %1 -c -obj -cpu h8s -system xxx    xxxにはシステム依存部のディレクトリ名が入る。  ・ベクタテーブルのサイズ    genvector.pl -s xxx    xxxにはベクタテーブルのサイズが入る。 また、環境によってはPerlのインタプリタへのパス設定も必要になる可能性が ある。 (b) jsp/utils/h8s-renesas/genvector.pl ベクタテーブル生成のためのPerlスクリプトgenvector.plの仕様 -s n ベクターテーブルのサイズ nは整数定数を仮定しており、それ以外の引数が与えられた 場合の動作は未定義である。 (c) vector.src内で用いられているマクロの仕様 C言語ルーチンの関数名から入口処理を生成するためのマクロINTHDR_ENTRYが 用意されている。スクリプトgenvector.plは、引数intmaskの値がintmask.inc 内に****_intmaskの名でマクロ定義されていると仮定している。       【アセンブラ言語でのAPI】      INTHDR_ENTRY c_routine    【パラメータ】      c_routine:C言語ルーチンの関数名    【展開結果】      割込みの入口処理    【機能】      C言語ルーチンの関数名から入口処理を生成する。 ・備考  ベクタテーブルと入口処理をvector.srcにまとめた結果、ラベル _kernel_****_entryはグローバルに公開する必要がなくなったため、ローカ ルラベルとしている。それに伴ないcpu_config.hのINT_ENTRYマクロでは共通 部とのインターフェースを合わせるため、ダミーのラベル名を使用している。 8. 制限事項 ・ホストマシンのOS  Windows9x系はサポートしない。 ・コンフィギュレータのチェッカ(chk)は実装していない。 ・HEWが提供する内部レジスタ定義ファイルには対応していない。  (gcc版とデバイスドライバを共有するため) ・64ビット整数はサポートしない。  (処理系の制限事項) ・相対時間について  RELTIM型が2バイトのため、(1msec単位で換算すると)相対時間が約65秒に 制限される。RELTIM型を4バイトにしたい場合はjsp/include/itron.hにある RELTIM型の定義を変更する。 変更前:typedef UINT RELTIM; /* 相対時間 */ 変更後:typedef UW RELTIM; /* 相対時間 */ ・atexit の処理とデストラクタの実行  (tool_config.hのcall_atexit())  他機種ではカーネルライブラリのリビルドを行わなくても、 software_term_hook()の定義があれば、自動的に呼び出されるようになってい るなっているが、h8s-renesasではsoftware_term_hook()に相当する関数名を マクロSOFTWARE_TERM_HOOKとして定義し、カーネルライブラリをリビルドする 必要がある。  詳しくは「7.1 マクロ定義」の「(3) SOFTWARE_TERM_HOOK」を参照。 9. 注意事項 ・システムログ機能について int型が2バイトのため、システムログ機能(syslog, syslog_n)の%d, %u, %x, %Xによる整数表示では2バイトデータしか表示できない。2バイトより大きい データを表示する場合は、%ld, %lxを使用する。 変更履歴 '05/12/09 サポート開始 '05/12/28 Release1.4.2 '07/03/xx Release1.4.3  修正  ・ベクタテーブル自動生成   ・perlスクリプトをgcc版と完全に共通化     ・0ベクタ問題に対応     ・ベクタサイズの引数チェックを追加   ・処理系毎の改行コードの違いに対応   ・DEF_INH文の途中で改行があるとパースに失敗する問題を修正   ・filter1.plとfilter2.plを1つにまとめ、grep_def_inh.plに改名    (gcc版とHEW版で個別にfilter2.plを用意する必要がなくなった)   ・移植性を考慮して、genvector.plの処理を2つに分割      ・genvector.pl:ベクタテーブルの生成(H8版と共通化)      ・gen_intentry.pl:割込みの入口処理(INTENTRY)の生成     ・これに伴ない、grep_def_inh.plとのインターフェースを変更  ・ビルド手順    ・カーネル・ライブラリを関数単位にリンクできるようビルド手順を変更     これにより、バッチファイルからコンパイラの呼び出しが不要になった。    ・API毎のファイルコピー処理にバッチファイルを使用すると     無用なメッセージが大量に表示されるため、perlで処理する     よう変更    ・Releaseビルドで最適化オプションが設定されていなかったミスを修正     (HEWでプロジェクトの追加、削除を行うとビルドオプションが      ご破算になり、再設定し忘れていた。)  ・特殊レジスタの操作を処理系純正のライブラリに変更  ・シリアルドライバ    ・SCI2をサポート(最大TNUM_PORT=3)    ・POL_PORTIDを新設  ・SILのメモリ空間アクセス関数を機種依存部で定義    コンパイラの警告を回避するため  ・DDRレジスタ・アクセス・ルーチン    ・I/Oポートの本数TNUM_IO_PORTの定義場所をh8s23xxf.hに移動    ・TNUM_IO_PORTの値を修正  ・サンプルプログラム    ・'Z'コマンド      直接kernel_exit()を呼んで、プログラム終了