= TOPPERS/JSPカーネル ユーザズマニュアル = (H8ターゲット依存部 (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 Copyright (C) 2001-2004 by Kunihiko Ohnaka Copyright (C) 2004 by Katsuhiro Amano 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation によって公表されている GNU General Public License の Version 2 に記 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, 利用と呼ぶ)することを無償で許諾する. (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 権表示,この利用条件および下記の無保証規定が,そのままの形でソー スコード中に含まれていること. (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 の無保証規定を掲載すること. (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 用できない形で再配布する場合には,次のいずれかの条件を満たすこ と. (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 作権表示,この利用条件および下記の無保証規定を掲載すること. (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに 報告すること. (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. 本ソフトウェアは,無保証で提供されているものである.上記著作権者お よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. @(#) $Id: h8-renesas.txt,v 1.9 2007/03/23 07:27:55 honda Exp $ ------------------------------------------------------------------------ 1. H8ターゲット依存部の概要 1. 1 ターゲットシステムと開発環境 ・Release1.4.1までのバージョンをお使いの方へ  Release1.4.2から割込みの扱いが大幅に変更されているため、旧バージョン をご使用の方は「2.2.1 割込みハンドラの登録方法」を参照されたい。  本実装はgcc対応だったH8依存部を(株)ルネサス ソリューションズ製の開発 環境H8C(HEW)に対応させたものである。 H8 プロセッサのターゲットシステムは、H8/3048F-ONEを搭載した以下の ボードである。 ・(株)北斗電子 H8/3048F-ONEスタータキット(型番HSB8F3048BF25) なお、何もしないタスク 1 個の最小構成でも、必要な RAM 容量は H8 の内蔵 RAMの容量を超える。 このため、外部アドレス空間を有効にする必要がある。 CPUモードはアドバンスドモードで使用することを前提としている。ノーマル モードで使用する場合は、アセンブラ部分を修正する必要がある。 1. 2 サポートする機能の概要 性能評価用システム時刻参照機能 (vxget_tim)、割込みマスクの変更・参照 (chg_ipm、 get_ipm)をサポートしているが、 割り込みの禁止と許可 (dis_int、ena_int) はサポートしていない。 1. 3 他のターゲットへのポーティング H8/300H シリーズであれば、ポーティングは容易に出来ると思われる。 1. 4 シリアルポート (SCI) H8/3048FにはSCI0とSCI1の2本のシリアルポートがあり、user_config.hに 定義しているTNUM_PORTにより何本使用するか指定できる。 現在の実装では2本まで使用できる。 JSP カーネルのログ出力用にはSCI0を 使用している。 シリアルポートの設定を以下に示す。 ・ボーレート   38400[bps] ・データ長    8ビット ・ストップビット 1ビット ・パリティなし 2. H8 プロセッサ依存部の機能 カーネルとシステムサービス機能の中で、H8依存の部分について解説する。 2. 1 データ型 int型とunsigned int型のサイズは 16ビットである。また、処理系の制約か ら、64ビット整数はサポートしていない。 2. 2 割込み管理機能と割込みハンドラ カーネル管理外の割込みはNMIのみである.よって,CPUロック状態や初期化 ルーチン内では,NMI以外の割込みはすべて禁止されている.具体的には、CPU ロック状態ではCCRレジスタのIビットとUIビットをセットし、さらにカーネル 内のフラグ変数をセットしている。  本実装ではSYSCRレジスタのUEビットをクリアし、CCRレジスタのIビットと UIビットを割込みマスク(IPM:Interrupt Priority Mask)として使用してい る。(レベル0とレベル1の割込みが使用できる。) DEF_INHで指定する割込みハンドラ番号(inhno)は,H8での例外ベクタ番号を 表し,そのデータ型(INHNO)はunsigned int型に定義されている. DEF_INHで,例外ベクタ番号として有効でない値や,外部割込みに対応しない 番号を指定した場合の動作は保証されない. 2.2.1 割込みハンドラの登録方法 jsp-1.4.1 H8依存部(gcc版)から割込みハンドラの登録方法が変更されている。 変更点は以下の通り。  1.割込み優先度制御をサポート    ・割込みプライオリティ・レベル0    ・割込みプライオリティ・レベル1  2.割込みレベルの設定は2ヶ所で行う。    (1) 割込み要求時用プライオリティ・レベル       デバイスが割込みコントローラに要求する割込みレベル       各デバイスドライバの初期化処理にてIPRA、IPRBレジスタの       設定処理を行う。    (2) 割込み許可時用プライオリティ・レベル       割込みハンドラ呼び出し時に割込みマスクに設定する値       他の割込み要求をブロックするための値  3.デバイスドライバの初期化処理で、割込みレベルの設定を行う。    define_int_plevel( )を用いる。  4.cpu_support.Sで行っていた以下の記述は不要になった。   (割込みレベル制御を行ったため)    ・ハードウェア割込み許可 _xxxxx_enable_int    ・ハードウェア割込み禁止 _xxxxx_disable_int      gcc版では、割込み要求をクリアする処理を_xxxxx_disable_intに      記述していたが、renesas版では割込みハンドラのC言語ルーチン      またはそこから呼ばれる関数内に記述する方法を標準とする。  5.ユーザーが編集すべき部分は別ファイルに分離している。    システム依存部のintmask.inc  6.割込みベクタテーブルの自動生成    コンフィギュレーション時にDEF_INH( )の引数から自動生成する。 割込みハンドラを登録する作業手順  タイマ割込みを例に説明する。  (1) 割込みハンドラの記述    旧版では、割込み要求をクリアする処理が必要な場合は    _xxxxx_disable_intに記述していたが、新版では割込みハンドラのC言    語ルーチン、またはそこから呼ばれる関数内に記述する方法を標準と    する。    タイマ割込みでの記述例:     jsp/systask/timer.c       timer_handler( )から呼び出されるhw_timer_int_clear( )       (jsp/config/h8-renesas/hw_timer.h)  (2) コンフィギュレーション・ファイルの記述    コンフィギュレーション・ファイルの記述方法は他のプロセッサと同様    である。    ベクタ番号はjsp/config/h8-renesas/h8_3048f.h等でマクロ定義している。    DEF_INH( )の第1引数の割込みハンドラ番号はプリプロセス後に整数定数    になっていなければならない。(自動割り付け非対応整数値パラメータ)    ベクタテーブル自動生成時もそれを仮定している。    タイマ割込みでの記述例:     jsp/systask/timer.cfg     DEF_INH(INHNO_TIMER, { TA_HLNG, timer_handler });  (3) 割込みプライオリティレベルの設定    IPRA,IPRBに設定する割込み要求時のプライオリティレベルと、割込み    ハンドラ呼び出し時に割込みマスクに設定するプライオリティレベル    の2つを割込み要因毎に設定する。  (3)-1 割込み要求時用プライオリティレベルの設定    初期化処理のcpu_initialize( )ですべての割込みをレベル0に初期化し    ている。    デバイスドライバの初期化処理で割込み要因毎のプライオリティ・レベ    ルを設定するための関数が用意されている。         【C言語API】      void define_int_plevel(const IRC *irc);       IRC:Interrupt Request Controller          割込みコントローラ    【パラメータ】      const IRC *irc 設定データを格納した領域の先頭アドレス      UB *ipr:設定するIPRレジスタの番地           IPRAまたはIPRBレジスタ      UB bit :IPRレジスタの該当するビット番号       IPM ipm:設定する割込みレベル           IPM_LEVEL0,IPM_LEVEL1のいずれか    【リターンパラメータ】      なし    【機能】      ircが指し示す領域のデータを用いて、デバイスからの割込みの      プライオリティ・レベルを設定する。      この関数を呼び出す前にh8_sil.hをインクルードする必要がある。    【タイマ割込みでの記述例】      jsp/config/h8-renesas/cpu_config.c       const IRC TIMER_IRC = {(UB*)SYSTEM_TIMER_IPR,       SYSTEM_TIMER_IP_BIT,       SYSTEM_TIMER_IPM       };      jsp/config/h8-renesas/hw_timer.h       hw_timer_initialize( )       define_int_plevel(&TIMER_IRC);    設定に用いる値はマクロ定義されている。        ・IPRA、IPRBレジスタのアドレス    jsp/config/h8-renesas/h8_3048f.h #define H8IPRA 0xfffff8ul #define H8IPRB 0xfffff9ul    ・IPRA、IPRBレジスタのビット番号    jsp/config/h8-renesas/h8_3048f.h    ・IPRA    #define H8IPR_IRQ0_BIT 7u /* IRQ0 */    #define H8IPR_IRQ1_BIT 6u /* IRQ1 */    #define H8IPR_IRQ2_BIT 5u /* IRQ2 */    #define H8IPR_IRQ3_BIT 5u /* IRQ3 */    #define H8IPR_IRQ4_BIT 4u /* IRQ4 */    #define H8IPR_IRQ5_BIT 4u /* IRQ5 */    #define H8IPR_WDT_BIT 3u /* WDT */    #define H8IPR_CMI_BIT 3u /* CMI */    #define H8IPR_ITU0_BIT 2u /* ITU0 */    #define H8IPR_ITU1_BIT 1u /* ITU1 */    #define H8IPR_ITU2_BIT 0u /* ITU2 */        ・IPRB    #define H8IPR_ITU3_BIT 7u /* ITU3 */    #define H8IPR_ITU4_BIT 6u /* ITU4 */    #define H8IPR_DMAC_BIT 5u /* DMAC (CH0,1) */    #define H8IPR_SCI0_BIT 3u /* SCI0 */    #define H8IPR_SCI1_BIT 2u /* SCI1 */    #define H8IPR_AD_BIT 1u /* A/D */ (3)-2 割込み許可時用プライオリティレベルの設定   ・****_intmaskマクロの定義    H8依存部では、静的API DEF_INH( )で割込みハンドラを定義すると、    カーネルコンフィギュレーションにより、割込みの入口処理が    vector.src内に自動生成される。    この入口処理では、C言語ルーチン****を呼び出す直前の割込み許可時    に割込みマスクに設定する値として、マクロ****_intmaskが定義されて    いると仮定しているので、割込み要因毎にIPM_LEVEL1、IPM_LEVEL2のい    ずれかに定義すること。    自分と同じレベルの割込みをマスクするため、IPMには1つ上のレベル    を設定する必要があるので、注意が必要である。    intmask.incで定義するのを標準とする。    【タイマ割込みでの記述例】     jsp/config/h8-renesas/hsb8f3048bf25/intmask.inc          timer_handler_intmask: .DEFINE "IPM_LEVEL2"      2.2.2 割込みマスクの変更・参照 H8依存の機能として,CCRレジスタ中の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_asm.incの中でマクロ 定義されている. H8依存の割込みマスクの変更・参照のためのサービスコールの仕様は次の通り. (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で用いる値として、以下のマクロが用意されている。  IPM_LEVEL0:レベル0 すべての割込みを受け付ける  IPM_LEVEL1:レベル1 NMIおよびプライオリティレベル1の割込みのみを             受け付ける  IPM_LEVEL2:レベル2 NMI以外の割込みを受け付けない IPMに指定した値が上記のマクロ以外の場合,E_PARエラーとなる.IPM を IPM_LEVEL0以外に設定した場合でも,ディスパッチは禁止されない.また,設 定したIPMの値は,ディスパッチ後も引き継がれる.ディスパッチを禁止し たい場合には,dis_dspと併用すればよい. なお,このサービスコールを用いて,IPMをIPM_LEVEL2(NMI以外の割込みを禁 止)に設定しても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例外ハンドラ H8プロセッサ自体にCPU例外を扱う機能が備わっていないため、カーネルのH8 依存部もCPU例外をサポートしていない。従って、CPU 例外ハンドラの設定関 数 define_exc( )は何もしない関数である。 他機種との互換性のため、CPU例外ハンドラ番号のデータ型 (EXCNO) は unsigned int型に定義されている。 2. 4 スタートアップモジュール H8依存のスタートアップモジュール (start.src) は次に示す初期化を実行し た後、カーネル (kernel_start) を起動する。ただし、 kernel_start から戻っ てくることは想定していない。 (1) スタックポインタの設定 (2) ハードウェア依存の初期化処理の呼出し       HARDWARE_INIT_HOOKマクロが定義されていれば、ハードウェア依      存の初期化処理を呼出す。この関数はカーネルを起動する前に、      ターゲット依存のハードウェア的な初期化を行うために用意し、そ      の関数名をHARDWARE_INIT_HOOKマクロとして定義する。       本実装では、外部メモリ空間の有効化の他にも、SYSCRレジスタ      のUEビットのクリア、割込み優先レジスタ(IPRAとIPRB)の個別割り      込みの優先度の設定を行っている。      HARDWARE_INIT_HOOKマクロの定義はsys_config_asm.incで行うのを      標準とする。 (3) Bセクションの初期化 Bセクションの全領域を 0 クリアする。 (4) Dセクションの初期化 Dセクションを外部 RAM に転送する。 (5) ソフトウェア環境依存の初期化処理の呼出し       SOFTWARE_INIT_HOOKマクロが定義されていれば、ソフトウェア環      境依存の初期化処理を呼出す。この関数はカーネルを起動する前に、      ソフトウェア環境(ライブラリ等)依存の初期化を行うために用意す      る。例えば、ライブラリの初期設定などである。      その関数名をSOFTWARE_INIT_HOOKマクロとして定義する。      SOFTWARE_INIT_HOOKマクロの定義はsys_config_asm.incで行うのを      標準とする。 2. 5 割込み発生時のスタック使用量について タスクコンテキスト実行時に割込みが発生し、その結果、タスクスイッチす る場合、タスクスタックには以下の情報が積まれるため、タスク毎に32バイト ずつスタック領域を余分に確保する必要がある。 (その後、元のタスクに戻ってくる際に、タスク例外処理ルーチンが起動され る場合はさらにタスクスタックの領域が必要になる。)  タスクスタックに積まれる内容   ・戻り番地   ・CCRレジスタ   ・er0〜er6 3. システム依存部の機能 3. 1 システムクロックドライバ システムクロックドライバが isig_tim を呼出す周期は、 user_config.h内 のTIC_NUME と TIC_DENO で定義されており、ディフォルトは 1[ms] 周期であ る。 この定義を変更することで、isig_tim を呼出す周期を変更できる。 ただし、 タイマ精度の単位で端数になる値を設定すると、 isig_tim の呼出し周期に誤 差が発生する。 【H8/3048F-ONEスタータキット】 タイマに供給されているクロック周波数は3072[kHz]であり (クロック24.576[MHz]の8分周)、タイマ精度は  (1000000/3072)[nsec]=約0.326[μsec] である。 ディフォルトのクロックデバイスとして、H8/3048F-ONEではITU0を使用して いる。 3. 2 性能評価用システム時刻参照機能 H8では、性能評価用システム時刻参照機能 (vxget_tim) をサポートしてい る。 【C言語API】   ER vxget_tim(SYSUTIM *p_sysutim); 【パラメータ】 なし 【リターンパラメータ】 SYSUTIM sysutim:リセットからの経過時間(μsec単位) 【エラーコード】 E_CTX:非タスクコンテキストから呼び出した 【機能】 リセットからの経過時間をμsec単位で計測し、実行性能の計測機能を提供す る。SYSUTIM型は UW型(32 ビット符号なし整数型)であるため、μsec単位で換 算するとリセットから約71分間毎にオーバーフローして、ゼロに戻る。2点間 の実行時間を計測するときにこのオーバーフローが発生していないか注意が必 要である。 【H8/3048F-ONEスタータキット】 タイマ自体の精度は約0.326[μsec]であり、1μsec単位まで有効である。 3. 3 シリアルインタフェースドライバ H8/3048F-ONEには SCI0 と SCI1 の 2 本のシリアルポートがあり、 user_config.h に定義している TNUM_PORT により何本使用するか指定できる。 現在の実装では 2 本まで使用できる。 JSP カーネルのログ出力用には SCI0 を使用している。 3. 4 メモリマップ 3. 4. 1 H8/3048F-ONEスタータキットのメモリマップ モード6に固定されている。 0x00,0000 - 0x01,ffff 内蔵ROM 128KB              ベクタテーブル、P,C,Dセクション 0x20,0000 - 0x27,ffff 外部RAM 512KB              R(D),Bセクション 0xff,ef10 - 0xff,efff 内蔵RAM 4KB              非タスクコンテキスト用スタックエリア 4. サンプルプログラムの実行手順 4. 1 開発環境 開発環境は、Windows 2000上で、(株)ルネサス ソリューションズ製の開発 環境を用いた。  本開発に用いたツールのバージョンを以下に示す。 ・コンパイラ、アセンブラ、最適化リンケージエディタ   型番:R0C40008XSW06R   バージョン:V.6.1.2 ・統合開発環境 HEW4.02.00.022 ・デバッガ E10T-USB Emulator   添付ソフトウェアのバージョン:2.01.00 また、他にも下記のツールが必要になる。 ・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) HEW上でのビルド ワークスペース・ファイルを開く  jsp/tools/H8-RENESAS/H8-RENESAS.hws  ワークスペース作成時とディレクトリが異なる旨の警告が出るが無視する。    ※ ツールチェーンのバージョンが異なる旨の警告が出る場合    上記のバージョンより古いツールチェーンでの動作は未確認である。 このワークスペースには4つのプロジェクトが登録されている。  ・genoffset:TCB構造体内のオフセットを求める。  ・libkernel:カーネル・ライブラリのビルドを行う。  ・configuration:カーネル・コンフィギュレーション、ベクタテーブルの           自動生成を行う。  ・sample:サンプル・アプリケーションのビルドを行う。 プロジェクトの依存関係のため、以下の順番でビルドする。  1.libkernelプロジェクトをアクティブプロジェクトに設定する  2.libkernelプロジェクトをビルドする  3.sampleプロジェクトをアクティブプロジェクトに設定する  4.sampleプロジェクトをビルドする 手順1と2は最初の1回のみでよく、アプリケーション部分のみソー スコードを変更した場合はリビルドする必要はない。 configurationプロジェクトとoffsetプロジェクトは依存プロジェ クトとして自動的にビルドされる。 sampleプロジェクトのビルドが成功すると、  ・実行ファイル sample1.abs  ・Sレコードファイル sample1.mot が生成されるよう設定してある。 注意:  libkernelのビルドより先にgenoffsetプロジェクトをビルドする必要が あるが、プロジェクト間の依存関係を設定してもsampleプロジェクトを起点と した場合(依存関係がネストしている場合)は正しい順序で実行されないので、 手動でlibkernelプロジェクトを予めビルドしておく。 備考  ReleaseビルドとDebugビルドの切替はHEWのビルド・コンフィギュレーショ ンによって行う。ビルド・コンフィギュレーションを変更すると、ファイルの 依存性チェックに失敗する場合がある。 (インクルードファイルが見つからない等)  その場合は、以下の手順で回避できる。  1.Windowsのコマンド・プロンプト(DOS窓)を開いて、    jsp/tools/H8-RENESAS/libkernelディレクトリでclean.batを実行する。  2.HEWの「ビルド」−「すべてをビルド」コマンドを実行する。 (2) ターゲット・ボードのダウンロード ボードやデバッグツールのマニュアルを参照。 4. 4 よくある質問と回答 Q. genoffsetとlibkernel, configurationとsampleのようにファイルを   生成するフェーズとそれをコンパイルするフェーズを異なるプロジェクト   に割り当てているのは何か理由があるのでしょうか? A. 最初は同じプロジェクト内に生成フェーズとコンパイルフェーズを   入れようとしたのですが、HEWはプロジェクトのビルドを開始する   際にファイルの依存関係をスキャンし、必要なソースファイルがそ   ろっていないビルドが止まってしまうため、現在のような形に分割   しました。   カスタムフェーズの順番は調整できますが、依存関係スキャンのタ   イミングは変えられないようです。 5. ファイル構成 5. 1 ディレクトリ・ファイル構成 (1) config/h8-renesas/ cpu_config.c H8プロセッサ依存部のC関数 cpu_config.h H8プロセッサ依存部の構成定義 cpu_config_asm.inc 上記のアセンブラ用定義 cpu_context.h H8プロセッサ依存部のコンテキスト操作 cpu_defs.h H8プロセッサ依存部のアプリケーション用定義 cpu_insn.h H8プロセッサの特殊命令の関数定義 cpu_support.src H8プロセッサのアセンブリ関数 cpu_rename.def カーネルの内部識別名のリネームとその解除の          定義リスト cpu_unrename.h カーネルの内部識別名のリネーム解除の定義 cpu_rename.h カーネルの内部識別名のリネームの定義 cpu_rename_asm.inc 上記のアセンブラ用定義 h8.h H8/300Hプロセッサの共通定義 makeoffset.c offset.h生成サポート用ソースファイル start.src スタートアップモジュール tool_config.h H8プロセッサの開発環境依存モジュール定義 tool_defs.h H8プロセッサの開発環境依存定義 vector_header.src 割込みベクタテーブルのヘッダー部分 h8_sil.c   SILのH8向け拡張 C関数 h8_sil.h   SILのH8向け拡張 構成定義 h8_3048f.h H8/3048Fプロセッサの定義           H8/3048F、H8/3048F-ONE兼用 h8_3048f_asm.inc 上記のアセンブラ用定義 util.h   ビット番号などの定義 util_asm.inc   上記のアセンブラ用定義 hw_serial.c SCI の変数と関数 hw_serial.cfg SCI のコンフィギュレーションファイル hw_serial.h SCI の定義 hw_timer.h ITU の定義 (2) config/h8-renesas/hsb8f3048bf25/ (株)北斗電子H8/3048F-ONEスタータキット(型番HSB8F3048BF25) ボードの依存部分 sys_config.c HSB8F3048BF25ボード依存部のC関数 sys_config.h HSB8F3048BF25ボード依存部の構成定義 sys_config_asm.inc 上記のアセンブラ用定義 sys_defs.h HSB8F3048BF25ボード依存部のアプリケーション          用定義 sys_support.src HSB8F3048BF25ボード依存部のアセンブリ関数 sys_rename.def カーネルの内部識別名のリネームとその解除の          定義リスト sys_rename.h カーネルの内部識別名のリネームの定義 sys_unrename.h カーネルの内部識別名のリネーム解除の定義 以下は、ユーザーが編集する必要があるファイル user_config.h  ユーザー・コンフィギュレーション情報の定義 user_config_asm.inc 上記のアセンブラ用定義 intmask.inc   割込みマスクの定義 (3) utils/     ビルドに必要なユーティリティ群  h8/      gcc版と共通のスクリプト  grep_def_inh.pl Perlスクリプト生成用フィルタ  h8-renesas/ H8C依存のスクリプト  copy_kernel_source.bat           カーネルのソースコードをAPI毎にコピー           するバッチファイル  genoffset    TCB構造体内のオフセットを算出するperlスクリプト  genvector.pl   ベクタテーブル生成用スクリプト  gen_intentry.pl 割込み入口処理生成用スクリプト (4) tools/H8-RENESAS/ HEW4.0用のワークスペース・ディレクトリ  (株)北斗電子H8/3048F-ONEスタータキット(型番HSB8F3048BF25) readme.txt  ビルド手順を示したreadmeファイル H8-RENESAS.hws  ワークスペース・ファイル sample1.cfg  サンプル・アプリケーションのコンフィギュレーション  ファイル sample1.c  サンプル・アプリケーションのC言語ソース・ファイル sample1.h  サンプル・アプリケーションのインクルード・ファイル (5) tools/H8-RENESAS/genoffset/     以下の処理を行うプロジェクト・ディレクトリ      ・カーネル・ソースコードをAPI毎にコピー      ・TCB構造体内のオフセット算出      call_copy_kernel_source.bat   copy_kernel_source.batを呼び出すためのバッチファイル call_genoffset.bat   genoffsetスクリプトを呼び出すためのバッチファイル      Debug/ デバッグ用ビルドディレクトリ       offset.inc  TCB構造体内のオフセット定義ファイル      Release/ デバッグ用ビルドディレクトリ       offset.inc  TCB構造体内のオフセット定義ファイル (6) tools/H8-RENESAS/libkernel     カーネル・ライブラリのビルドを行うプロジェクト・ディレクトリ          kernel_source/   中間ファイルを格納するディレクトリ       clean.bat   中間ファイルを削除するためのバッチファイル (7) tools/H8-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 自動生成された割込みベクタテーブル       (7) tools/H8-RENESAS/sample     サンプル・アプリケーションのビルドを行うプロジェクト・ディレクトリ          set_sp.hdc     デバッガでスタックポインタを初期化するための               バッチファイル 6. アプリケーション開発者向けの情報 アプリケーション開発者に有益と思われる情報について述べる。 6.1 カーネルの設定変更方法 H8依存部では、様々な設定変更が容易にできるよう、設定箇所をを以下の2つ のファイルにまとめている。  ・user_config.h    C言語向け設定ファイル  ・user_config_asm.inc アセンブラ言語用設定ファイル ユーザーはこの2つのファイル内のマクロ定義を変更するだけで、カーネルの ソースファイルを読まなくてもある程度までカーネルの設定を変更できる。 設定項目によってはC言語用とアセンブラ言語用の両方の定義が必要になるの で注意。 以下、設定ファイル内の各マクロの意味を述べる。 ・全般的な設定項目 (1) SUPPORT_CHG_IPM chg_ipmをサポートするかどうかの定義 設定ファイル:user_config.h、user_config_asm.inc (2) SUPPORT_VXGET_TIM vxget_timをサポートするかどうかの定義 この設定を変更した場合は、ファイル分割を再度行う必要がある。 設定ファイル:user_config.h (3) CPU_CLOCK プロセッサに供給されるクロック周波数 [Hz] 設定ファイル:user_config.h、user_config_asm.inc (4) STACKTOP 非タスクコンテキスト用スタックポインタの初期値 設定ファイル:user_config_asm.inc (5) E10T E10T-USB Emulatorでデバッグする場合はこのマクロを定義する。 E10T使用時に必要な処理をスタートアップルーチンで行う。 定義場所:アセンブラのオプションとして与える。      (HEWのビルドオプション) ・シリアルポート関連の設定項目 (1) TNUM_PORT サポートするシリアルデバイスの数(最大 2) 設定ファイル:user_config.h、user_config_asm.inc 以下、ポート2の設定はTNUM_PORTを2に設定した場合のみ有効である。 (2) SYSTEM_PORTID、USER_PORTID システムポート、ユーザーポートのポート番号 USER_PORTIDの設定はTNUM_PORTを2に設定した場合のみ有効である。 設定ファイル:user_config.h (3) SCI_LOW_PORTID ポーリングによる低レベル出力に用いるシリアルポートのポート番号 設定ファイル:user_config.h (4) SCI_PORT1_BAUD_RATE、SCI_PORT2_BAUD_RATE ポート1,2のボーレート [bps] 設定ファイル:user_config.h (5) SCI_PORT1_IPM、SCI_PORT2_IPM ポート1,2の割込みプライオリティ・レベル (割込み発生時のIRCへの要求レベル) 設定ファイル:user_config.h (6) H8_CFG_SCI_ERR_HANDLER シリアル受信エラー割込みに通常の受信割込みとは別のハンドラを割り当てる かどうかの定義 設定ファイル:user_config.h、user_config_asm.inc ・タイマ関連の設定項目 (1) TIC_NUME、TIC_DENO タイムティックの周期の分子、分母 設定ファイル:user_config.h (2) TIMER_CLOCK タイマに供給されるクロック周波数[kHz] 設定ファイル:user_config.h (3) SYSTEM_TIMER_IPM タイマ割込みのプライオリティ・レベル (割込み発生時のIRCへの要求レベル) 設定ファイル:user_config.h 6.2 アプリケーション向けに提供される機能 H8依存部ではアプリケーションを開発しやすくするため、以下の機能を提供し ている。 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レジスタへのアクセス補助機能 H8のI/Oポートのデータ・ディレクション・レジスタDDRは書き込み専用であり、 そのままでは所望のビットだけを変更することができない。 (bset,bclr命令でも回避不可) また、カーネルのスタートアップルーチンでもいくつかのDDRレジスタに対し て設定を行っているため、そのままではカーネルとアプリケーションの間で整 合性を保つことができない。 そのため、本実装では、メモリ上にテンポラリを用意して、DDRの現在値を保 持する方法を採っている。 本機能を利用する場合はh8_sil.hをインクルードする必要がある。 ポート番号はIO_PORT型として定義してあり、IO_PORT1, IO_PORT2, IO_PORT3, IO_PORT4, IO_PORT5, IO_PORT6, IO_PORT8, IO_PORT9, IO_PORTA, IO_PORTBの いずれかを指定する。(ポート7は入力専用のため、DDRレジスタがない。) ポート番号として、これら以外の値を指定した場合はassert文でエラーとなる。 (1) sil_reb_ddr  DDRレジスタの読み出し 【C言語API】   UB sil_reb_ddr(IO_PORT port); 【パラメータ】 IO_PORT port    ポート番号 【リターンパラメータ】 DDRレジスタの値 【エラーコード】 なし 【機能】 portで指定されるポート番号のDDRレジスタの値を読み出す。 (2) sil_wrb_ddr  DDRレジスタへの書き込み 【C言語API】   void sil_wrb_ddr(IO_PORT port, UB data); 【パラメータ】 IO_PORT port  ポート番号 UB data    書き込む値 【リターンパラメータ】 なし 【エラーコード】 なし 【機能】 portで指定されるポート番号のDDRレジスタに値dataを書き込む。 (3) sil_anb_ddr  DDRレジスタのAND演算 【C言語API】   void sil_anb_ddr(IO_PORT port, UB data); 【パラメータ】 IO_PORT port  ポート番号 UB data    AND演算を行う値 【リターンパラメータ】 なし 【エラーコード】 なし 【機能】 portで指定されるポート番号のDDRレジスタに対して、値dataとのAND演算を 行う。 (4) sil_orb_ddr  DDRレジスタのOR演算 【C言語API】   void sil_orb_ddr(IO_PORT port, UB data); 【パラメータ】 IO_PORT port  ポート番号 UB data    AND演算を行う値 【リターンパラメータ】 なし 【エラーコード】 なし 【機能】 portで指定されるポート番号のDDRレジスタに対して、値dataとのOR演算を 行う。 7. カーネル移植者向けの情報  H8依存部を他のターゲット・ボードへを移植する際に必要な情報を以下に 述べる。 7.1 マクロ定義 (1) SYSCR_SYS SYSCRの初期値 ボード依存部で定義する内容  ・ビット6-4 STS:スタンバイ・タイマ・セレクト  ・ビット2 NMIEG:NMIエッジ 定義ファイル:sys_config.h 残りのビットはCPU依存部で定義している。 (2) HARDWARE_INIT_HOOK スタートアップルーチンからハードウェア依存の初期化処理を呼び出すときは、 その先頭アドレスをマクロ定義する。 (GNU ldのPROVIDE命令と同等の機能がないため) 定義ファイル:sys_config_asm.inc (3) SOFTWARE_INIT_HOOK スタートアップルーチンからソフトウェア環境(特にライブラリ)依存の処理を 呼び出すときは、その先頭アドレスをマクロ定義する。 定義ファイル:sys_config_asm.inc (4) WITHOUT_INNER_RAM 内蔵RAMを使用しない場合は、このマクロを定義する。 内蔵RAMを使用しない場合は、外部RAMが有効にならないとスタックエリアが使 えない。そのため、戻り番地をスタックに積むH8プロセッサの関数呼び出しは (アセンブラであっても)このタイミングではまだできない。つまり、 HARDWARE_INIT_HOOKで示される関数からは無条件分岐命令で戻ってくる。 (ラベルstart_1をエクスポートする。) 定義ファイル:sys_config_asm.inc (5) EXCLUSIVE_BUS sleep命令によってソフトウェア・スタンバイ・モードに遷移する際、バス権 要求の競合が起こる場合がある。(例えば、H8/3048Fのハードウェア・マニュ アル「6.4.4 ソフトウェア・スタンバイ・モードへの遷移」参照) EXCLUSIVE_BUSマクロが定義されると、ディスパッチャのsleep命令の前後にバ ス権要求の排他制御が挿入される。 定義ファイル:sys_config_asm.inc (6) SOFTWARE_TERM_HOOK atexit( )から呼び出す処理が外部定義されている場合は、その関数名をマクロ 定義する。atexit( )では  ・外部定義があれば、それを呼び出す ・外部定義がなければ、何もしない(空の定義) 定義ファイル:sys_config.h (7) DDRアクセスルーチンのための定数定義 (a) DDRレジスタのアドレス DDRレジスタのアドレスを以下のマクロ名で定義する。 H8P1DDR, H8P2DDR, H8P3DDR, H8P4DDR, H8P5DDR, H8P6DDR, H8P8DDR, H8P9DDR, H8PADDR, H8PBDDR 定義ファイル:sys_config.hからインクルードされるファイル        h8_30xxf.hで定義するのを標準とする。 (b) DDRレジスタの初期値 スタートアップルーチン実行直後のDDRレジスタの値を以下のマクロ名で定義 する。   H8P1DDR0、H8P2DDR0、H8P3DDR0、H8P4DDR0、H8P5DDR0、   H8P6DDR0、H8P8DDR0、H8P9DDR0、H8PADDR0、H8PBDDR0 定義ファイル:sys_config.h 7.2 ビルド用のスクリプトについて (a) jsp/tools/H8-RENESAS/configuration/call_configurator.bat HEWでは、(ワークスペース・ディレクトリの外にある)外部ツールを相対パ ス指定で呼び出せないため、このようなバッチファイルを介して、  ・コンフィギュレータ  ・Perlスクリプト を呼び出している。 以下のxxxの部分を移植の際に変更する必要がある。  ・システム依存部のディレクトリ名    cfg.exe -s %1 -c -obj -cpu h8 -system xxx    xxxにはシステム依存部のディレクトリ名が入る。  ・ベクタテーブルのサイズ    genvector.pl -s xxx    xxxにはベクタテーブルのサイズが入る。 また、環境によってはPerlのインタプリタへのパス設定も必要になる可能性が ある。 (b) jsp/utils/h8-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, intmask    【パラメータ】      c_routine:C言語ルーチンの関数名      intmask :C言語ルーチンを呼び出す直前の割込み許可時に割込み            マスクに設定する値            IPM_LEVEL1、IPM_LEVEL2のいずれかにすること。            自分と同じレベルの割込みをマスクするため、IPMには            1つ上のレベルを設定する。    【展開結果】      割込みの入口処理    【機能】      C言語ルーチンの関数名から入口処理を生成する。 ・備考  ベクタテーブルと入口処理をvector.srcにまとめた結果、ラベル _kernel_****_entryはグローバルに公開する必要がなくなったため、ローカ ルラベルとしている。それに伴ないcpu_config.hのINT_ENTRYマクロでは共通 部とのインターフェースを合わせるため、ダミーのラベル名を使用している。 7.3 その他 ・4.3節(2)のプロジェクト構成について  ファイル分割はlibkernelプロジェクトの1フェーズとして定義した方が見 通しが良くなるが、この方法では、ファイル分割を一番最初に実行するビル ド・フェーズとして定義しても、ファイル分割を行う前にコンパイル・フェー ズのファイルの依存関係のチェックが行われ、ファイルが開けない旨の警告が 大量に表示されてしまう。 8. 制限事項 ・ホストマシンのOS  Windows9x系はサポートしない。 ・コンフィギュレータのチェッカ(chk)は実装していない。 ・HEWが提供する内部レジスタ定義ファイルには対応していない。  (gcc版とデバイスドライバを共有するため) ・64ビット整数はサポートしない。  (処理系の制限事項) ・システムログ機能について int型が2バイトのため、システムログ機能(syslog, syslog_n)の%d, %u, %x, %Xによる整数表示では2バイトデータしか表示できない。2バイトより大きい データを表示する場合は、表示するデータを2バイトずつに分割してシステム ログ機能に渡す必要がある。(ポインタ型表示の%pを使えば4バイトまで表示 できる。) ・相対時間について  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()の定義があれば、自動的に呼び出されるようになってい るなっているが、h8-renesasではsoftware_term_hook()に相当する関数名をマ クロSOFTWARE_TERM_HOOKとして定義し、カーネルライブラリをリビルドする必 要がある。  詳しくは「7.1 マクロ定義」の「(6) SOFTWARE_TERM_HOOK」を参照。 9. gcc版(jsp-1.4.1 H8依存部)からの変更点 ・割込みハンドラの登録方法の変更(2.2節参照) ・割込み優先度制御のサポート   ・2レベル   ・これに伴い、割込みマスクの変更・参照機能をサポート ・微少時間待ちをサポート ・DDRレジスタ・アクセス・ルーチンの新設 ・ユーザー設定項目の整理 変更履歴 '05/05/10 サポート開始 '05/12/28 Release1.4.2  修正  ・割込みベクタテーブル    ・自動生成するよう仕様変更    ・perlスクリプトのヒア・ドキュメントが出力時に文字化けする不具合     を修正(全角文字を半角文字に変更)  ・割込みマスクの定義方法    ・ユーザーは割込みマスクの定義だけ行えば済むように仕様変更    ・グローバルだった_kernel_xxxx_entryラベルはローカルラベルに変更    ・割込みの入口処理もvector.srcに書き出すよう変更  ・TCB構造体のオフセット算出    ・MOV.B #8:8,R0Lのように定数部のビット幅が明示されたときにパース     できない不具合を修正    ・オフセット値が16進数の場合に対応    ・makefile.mak内のパス設定で「スペースを含むロングネーム」につ     いての記述を追加  ・登録されていない割込みの扱い    ・cpu_experr( )      ・割込み発生直前のスタックポインタの値(オフセット値)を修正      ・syslog( )で4バイトデータを表示するため、%p指定(ポインタ型)       を用いるよう変更       (%x(整数型)では2バイトしか表示できないため)    ・no_reg_exception()      ・スタックから取り出したpcとccrを分離していなかった不具合を       修正      ・syslog関数で4バイトデータをそのまま引数にしていた不具合を       修正        (intサイズ(=2バイト)の引数しか渡せない)  ・アセンブラルーチンの設計見直し    ・CPUロックフラグのクリア位置の見直し      ・割込みの出口処理      ・実行すべきタスクがない場合の割込み待ち    ・条件分岐命令直前の不要なor命令を削除      (その前のmov命令だけで十分)  ・DDRアクセスルーチン    ・sil_reb_ddr(), sil_wrb_ddr()       assert文の引数チェックの範囲ミスを修正  ・ビルド手順     Releaseビルド時にモジュール間最適化を積極的に適用するように     設定を変更  ・システムログ機能    ・表示できるデータサイズについて制限事項を追記 '07/03/xx Release1.4.3  ・ベクタテーブル自動生成    ・perlスクリプトをgcc版と完全に共通化      ・0ベクタ問題に対応      ・ベクタサイズの引数チェックを追加      ・割込み番号にuがついている場合の処理を追加    ・移植性を考慮して、genvector.plの処理を2つに分割      ・genvector.pl:ベクタテーブルの生成(H8S版と共通化)      ・gen_intentry.pl:割込みの入口処理(INTENTRY)の生成    ・これに伴ない、grep_def_inh.plとのインターフェースを変更    ・処理系毎の改行コードの違いに対応    ・DEF_INH文の途中で改行があるとパースに失敗する問題を修正    ・filter1.plとfilter2.plを1つにまとめ、grep_def_inh.plに改名     (gcc版とHEW版で個別にfilter2.plを用意する必要がなくなった)  ・割り込みレベルの設定    ・h8_sil.hのdefine_int_plevel()      cpu_insh.hをインクルードしないで、bitset(),bitclr()を呼び      出していた不具合を修正    ・bitset, bitclr      (アセンブラで記述した)関数呼び出しからマクロ定義に変更        →関数呼び出しのオーバーヘッドを無くすため  ・ビルド手順    ・DebugとReleaseでカーネルコンフィギュレーション結果を別々に     持てるように、ビルド手順を変更    ・API毎のファイルコピー処理にバッチファイルを使用すると     無用なメッセージが大量に表示されるため、perlで処理する     よう変更    ・H8S版との整合性      カスタムビルドでhmakeを呼び出さず、バッチファイルのみで      処理するようビルド手順を変更      これにより、       ・hmakeへのパス設定が不要になる。        (プロジェクトファイルの可搬性が向上)       ・カスタムビルド内で行っていたプリプロセスが不要になるので        処理時間が短縮  ・特殊レジスタの操作を処理系純正のライブラリに変更  ・DDRアクセス関数    ポート番号の型をINT型からIO_PORT型に変更  ・SILのメモリ空間アクセス関数を機種依存部で定義    コンパイラの警告を回避するため  ・サンプルプログラム    user_config.hからTASK_PORTIDの定義を削除