               ＝ TOPPERS/JSPカーネル ユーザズマニュアル ＝
                  （H8Sターゲット依存部 (H8C(HEW)対応版)）
   
               （Release 1.4.3対応，最終更新: 08-Mar-2007）
   
   ------------------------------------------------------------------------ 
    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動作モード：アドバンスドモード
　割込み制御モード２
他のモードで使用する場合は、アセンブラ部分を修正する必要がある。

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  割込み管理機能と割込みハンドラ

本実装では割込み制御モード２のみをサポートしている。
（割込みモード０についてはH8と互換なので、H8ターゲット依存部 (H8C(HEW)
対応版)が参考になると思われる。）

user_config.hとuser_config.incで定義されるMAX_IPMマクロにより、カーネ
ルが管理する割込みレベルが変更できる。
IPM：Interrupt Priority Mask
（処理系の仕様により、定義ファイルが２つあるので注意）

　　カーネル管理下の割込み ＝ 割込みレベルが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に設定した場合、最高７つの割込みがネストする。そのすべてが上
記の割込み禁止前に受け付けられた場合、２つ目以降の割込みもスタック切り
替え前のタスクスタックにレジスタが退避される。このときのタスクスタック
の消費量は
　
　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

また、他にも下記のツールが必要になる。
   ・Visual C++6.0またはVisual C++ .NET
   　　コンフィギュレータをビルドするために必要となる。

   ・Windowsのコマンド・プロンプトで動作するPerl
   　　下記の4.3 (1)の作業で使用する。
   　　Active Perl v5.8.8
       　配布元　http://www.ActiveState.com

4. 2  コンフィギュレータのビルド

jsp/cfgディレクトリ以下のにあるコンフィギュレータをビルドする。
ビルド方法
　jsp/cfg/vc_project/make.vbsを実行する。
　途中でVisual C++用かCygwin用か選択肢があるので、Visual C++用を
　選択する。

詳しくはjsp/doc/windows.txtを参照。

4. 3  サンプルプログラムのビルド
(1) 環境設定
　Perlのインタプリタへのパス設定を行う。

(2) HEW上でのビルド

ワークスペース・ファイルを開く
　jsp/tools/H8S-RENESAS/H8S-RENESAS.hws
　ワークスペース作成時とディレクトリが異なる旨の警告が出るが無視する。
　
　※ ツールチェーンのバージョンが異なる旨の警告が出る場合
　　　上記のバージョンより古いツールチェーンでの動作は未確認である。

このワークスペースには4つのプロジェクトが登録されている。
　・offset：TCB構造体内のオフセットを求める。
　　　　　　カーネルソースコードをAPI毎にコピーする。
　・libkernel：カーネル・ライブラリのビルドを行う。
　・configuration：カーネル・コンフィギュレーション、ベクタテーブルの
　　　　　　　　　　自動生成を行う。
　・sample：サンプル・アプリケーションのビルドを行う。

プロジェクトの依存関係のため、以下の順番でビルドする。
　１．libkernelプロジェクトをアクティブプロジェクトに設定する
　２．libkernelプロジェクトをビルドする
　３．sampleプロジェクトをアクティブプロジェクトに設定する
　４．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依存部では、様々な設定変更が容易にできるよう、設定箇所をを以下の２つ
のファイルにまとめている。
　・user_config.h　　C言語向け設定ファイル
　・user_config.inc　アセンブラ言語用設定ファイル

ユーザーはこの２つのファイル内のマクロ定義を変更するだけで、カーネルの
ソースファイルを読まなくてもある程度までカーネルの設定を変更できる。
設定項目によっては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を１つにまとめ、grep_def_inh.plに改名
　　　（gcc版とHEW版で個別にfilter2.plを用意する必要がなくなった）
　　・移植性を考慮して、genvector.plの処理を２つに分割
　　　　　・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()を呼んで、プログラム終了

