            ＝ TOPPERS/JSPカーネル ユーザズマニュアル ＝
                         （TLCS900 ターゲット依存部）

            （Release 1.4.3対応，最終更新: 17-Apr-2007）

------------------------------------------------------------------------ 
 TOPPERS/JSP Kernel

     Toyohashi Open Platform for Embedded Real-Time Systems/
     Just Standard Profile Kernel

 Copyright (C) 2006-2007 by Witz Corporation, JAPAN

 上記著作権者は，以下の (1)〜(4) の条件か，Free Software Foundation 
 によって公表されている GNU General Public License の Version 2 に記
 述されている条件を満たす場合に限り，本ソフトウェア（本ソフトウェア
 を改変したものを含む．以下同じ）を使用・複製・改変・再配布（以下，
 利用と呼ぶ）することを無償で許諾する．
 (1) 本ソフトウェアをソースコードの形で利用する場合には，上記の著作
     権表示，この利用条件および下記の無保証規定が，そのままの形でソー
     スコード中に含まれていること．
 (2) 本ソフトウェアを，ライブラリ形式など，他のソフトウェア開発に使
     用できる形で再配布する場合には，再配布に伴うドキュメント（利用
     者マニュアルなど）に，上記の著作権表示，この利用条件および下記
     の無保証規定を掲載すること．
 (3) 本ソフトウェアを，機器に組み込むなど，他のソフトウェア開発に使
     用できない形で再配布する場合には，次のいずれかの条件を満たすこ
     と．
   (a) 再配布に伴うドキュメント（利用者マニュアルなど）に，上記の著
       作権表示，この利用条件および下記の無保証規定を掲載すること．
   (b) 再配布の形態を，別に定める方法によって，TOPPERSプロジェクトに
       報告すること．
 (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
     害からも，上記著作権者およびTOPPERSプロジェクトを免責すること．

 本ソフトウェアは，無保証で提供されているものである．上記著作権者お
 よびTOPPERSプロジェクトは，本ソフトウェアに関して，その適用可能性も
 含めて，いかなる保証も行わない．また，本ソフトウェアの利用により直
 接的または間接的に生じたいかなる損害に関しても，その責任を負わない．

 @(#) $Id: tlcs900.txt,v 1.1 2009-12-23 14:49:01 suikan Exp $
------------------------------------------------------------------------

1  TLCS900 ターゲット依存部の概要

1.1  ターゲットシステムと開発環境

TLCS900プロセッサのターゲットシステムは，タマデン工業株式会社のZup-F16
拡張ボードとをサポートしている．Zup-F16拡張ボードはTMP91CY22-CPUを搭載
している．

1.2  開発環境と実行環境

Zup-F16拡張ボードキットに同梱されているCD-ROM中の東芝セミコンダクタ社製
の開発環境(TOSHIBA IDE)を使用して開発を行う．
JSP1.4.2のWindows版実行が可能でシリアルポートをもつパソコンがあれば，
構築，ボード上実行が可能である．

1.3  サポートする機能の概要

割込みマスクの変更・参照 (chg_ixx， get_ixx)はサポートしているが，性能
評価用システム時刻参照機能 (vxget_tim) ，割り込みの禁止と許可
(dis_int，ena_int) はサポートしていない．

1.4  他のターゲットへのポーティング

TLCS900シリーズであればシステム依存部の修正のみでポーティングが可能と
思われる．また，他のシリーズのCPUでも構造が大きく違っていなければ，容
易にポーティングは可能である．なお，テスト環境の都合上，Zup-F16拡張ボ
ード以外での動作確認は行っていない．

1.5  シリアルポート (SIO)

ボード上はUART1が実装されている．ポーティングにおいては，UART0/1両方
とも動作可能なように配慮しているが，動作確認はUART1のみ行っている．
シリアルポートの設定は以下の通りである． 

	・ボーレイト：19200bps
	・データ長：8 ビット．
	・ストップビット：1 ビット
	・パリティ：なし

2  TLCS900 プロセッサ依存部の機能

この節では，カーネルおよびシステムサービスの機能の中で，TLCS900依存の
部分について解説する．

2.1  データ型

int 型と unsigned int 型のサイズは 16ビットである．また，_int64_は対応
していない．ポインタ型のサイズは 32ビットである．

2.2  割込み管理機能と割込みハンドラ

カーネル管理外の割込みは NMI のみである．CPUロック状態や初期化ルーチン
内では NMI 以外の割込みは全て禁止される．具体的には，割込みマスクが７
に設定される．

割込みハンドラはCPUの設定位置に静的に配置される．本開発環境ではコンフィ
ギュレーションから生成されるkernel_cfg.cの内容を識別し，自動的に静的な
割込みハンドラを生成するユーティリティを用意している．このユーティリテ
ィはutils/tlcs900-toshibaデレクトリィ中のtlcs900vec.exeコマンドで，プリ
コンパイルされたkernel_cfg.cの内容を解析し割込みベクタテーブルファイル
であるtlcs900vec.incを生成する．tlcs900vec.incはCPUのスタートアップモ
ジュールであるstart.appにインクルードされており，コンフィギュレーション
ファイルの割込みハンドラ設定をROM上に静的に配置する．
なお，割込みハンドラが登録されなかった割込み要因には，未使用割込み処理
_unused_interrupt が登録される．また，割込み要因番号１はスタートアップ
処理 _start が登録される．
DEF_INH で指定する割込みハンドラ番号（inhno）は，TMP91CY22 でのベクタ値
を表し，そのデータ型（INHNO）はunsigned int型に定義されている．
DEF_INH で，ベクタ値として有効でない値や，外部割込みに対応しない値を指
定した場合の動作は保証されない．

chg_ipm をサポートするために，割込みハンドラの出入口処理などにオーバヘッ
ドを生じている．そこで，SUPPORT_CHG_IPM というマクロにより，これらのサー
ビスコールをサポートするかどうかを切り替えられるようにしている．
SUPPORT_CHG_IPM は，cpu_config.h の中でマクロ定義されている．

TLCS900 依存の割込みマスクの変更・取得のためのサービスコールの仕様は以
下の通りである．

(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〜6 以外の場合，E_PARエラーとなる．IPM を 0〜6 に設定した場合
でも，ディスパッチは禁止されない．また，設定した IPM の値は，ディスパッ
チ後も引き継がれる．ディスパッチを禁止したい場合には，dis_dsp と併用す
ればよい．

なお，このサービスコールを用いて，IPM を 7 （すべての割込みを禁止）に
設定することはできない．IPM を 7 にしたい場合には，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 例外ハンドラ

CPU例外として，ハードウェアノンマスカブル割込みとソフトウェアノンマスカ
ブル割込みがある．ハードウェアノンマスカブル割込み中のリセットを除いて
ハンドラの設定が可能である．
CPU例外ハンドラは割込みハンドラと同様にCPUの設定位置に静的に配置される
．CPU例外ハンドラに関しても割込みハンドラと同様にtlcs900vec.exeを用いて，
自動的に静的なCPU例外ハンドラを生成することができる．このデータは割込み
ハンドラと同様にtlcs900vec.incに設定される．
DEF_EXC で指定する割込みハンドラ番号（excno）は，M16Cでの例外ベクタ
番号を表し，そのデータ型（EXCNO）は unsigned int型に定義されている．
DEF_EXC で指定するCPU例外ハンドラ番号（excno）は，TMP91CY22 でのベクタ
値を表し，そのデータ型（EXCNO）はunsigned int型に定義されている．
DEF_EXC で，ベクタ値として有効でない値を指定した場合の動作は保証されな
い．

2.4  スタートアップモジュール

TLCS900 依存のスタートアップモジュール (start.app) は次に示す初期化を
実行した後，カーネル (kernel_start) を起動する．ただし， kernel_start 
から戻ってくることは想定していない．

(1) 割込みの禁止

(2) スタックポインタの設定

(3) 割込みネストレジスタの初期化

(4) hardware_init_hook の呼出し

hardware_init_hook が 0 でない場合には，hardware_init_hook を呼び出す．
hardware_init_hook は，カーネルが起動される前に行う必要があるターゲッ
ト依存の初期化を行うために用意している．hardware_init_hook がどこでも
定義されていない場合，リンカでこのシンボルを 0 に定義する（リンカスク
リプト内に記述あり）．

(5) areaセクションと dataセクションの初期化

areaセクションをゼロクリアする．また，dataセクションを初期化する．

(6) software_init_hook の呼出し

software_init_hook が 0 でない場合には，software_init_hook を呼び出す．
software_init_hook は，カーネルが起動される前に行う必要があるソフトウェ
ア環境（具体的には，ライブラリ）依存の初期化を行うために用意している．
software_init_hook がどこでも定義されていない場合，リンカでこのシンボ
ルを 0 に定義する（リンカスクリプト内に記述あり）．

(7) カーネルの起動

kernel_start へ分岐し，カーネルを起動する．kernel_start からリターンし
てくることは想定していない．

3  Zup-F16-ex システム依存部の機能

3.1  システムクロックドライバ

システムクロックドライバがisig_timを呼び出す周期は，sys_defs.h中の
TIC_NUMEとTIC_DENOで定義されている（標準は 1ミリ秒周期）．この定義を変
更することで，isig_timを呼び出す周期を変更することができる．ただし，タ
イマの精度が50μ秒程度であるため，50μ秒単位で端数になる値を設定した場
合には，isig_timの呼出し周期に誤差が生じることになる．

3.2  シリアルインタフェースドライバ

Zup-F16拡張ボードではUART1のシリアルポートがボード上に実装されている．
このためUART1をログ出力用に使用している．

3.3  メモリマップ

	0x000000 - 0x0003ff		内部IO(SFR)領域
	0x001000 - 0x004bff		内蔵 RAM area data
	0x004c00 - 0x004fff		内蔵 RAM stack
	0x100000 - 0x200000		外部 RAM 未使用
	0xfc0000 - 0xfffeff		内蔵 ROM code const
	0xffff00 - 0xffffff		内蔵 ROM vecter

4  開発

4.1  開発環境の構築

開発環境は，Windows 2000とWindows XPを用いた．Zup-F16拡張ボードキット
に同梱されているCD-ROM中の東芝セミコンダクタ社製の開発環境(TOSHIBA IDE)
を使用して開発を行う．なお，カーネル部のライブラリ化は行っていない．

	使用した開発環境のバージョン
		TIDE 2.3.1.1

4.1.1  ツールの構築

utils/tlcs900-toshiba 上のツール tlcs900offset.exe と tlcs900vec.exe を
構築します.
utils/tlcs900-toshiba 内の Microsoft Visual C++ ワークスペースファイル
tlcs900_toshiba.dsw を開きます．ビルドメニューにてそれぞれのプロジェク
トをビルドし，tlcs900offset.exe と tlcs900vec.exe を生成します．必要に
応じてビルドメニューのバッチビルドを使用するか，アクティブなプロジェク
トの構成を使用してプロジェクトを変更し，リビルドを行ってください．

なお、カーネル構築にあたっては、コンフィギュレータを使用するため，同様
の方法で cfg/vc_project 内の configurator.dsw を開き，cfg.exe を構築し
てください．

4.1.2  サンプルプロジェクトのビルド

Zup-F16拡張ボードキットに同梱されているCD-ROM中の東芝セミコンダクタ社
製の開発環境(TOSHIBA IDE)をインストールする．TOSHIBA IDE 起動し，
tools/TLCS900-TOSHIBA内のTOSHIBA IDEワークスペースファイル
TLCS900-TOSHIBA.tws を開きます．ビルドメニューよりリビルドを行います．
アクティブなプロジェクトの構成によりtools/TLCS900-TOSHIBA/Zup-F16-ex
内の release または debug 階層に，ロードモジュールファイル
Zup-F16-ex.h20 が生成されます．

4.1.3  フラッシュROMへの書込み

Zup-F16拡張ボードキットに同梱されているCD-ROM中のタマデン工業株式会社
製のローダプログラムを任意の階層にコピーする．ローダプログラムを起動
する．この時使用するCOMポートの設定などをローダプログラムと同じ階層に
ある設定ファイル FROMLoad.ini に設定する必要がある．パソコンとZup-F16
拡張ボードをシリアルクロスケーブルで接続し，Zup-F16拡張ボードの sw1 を
B 側に設定して，Zup-F16拡張ボードの電源をONにする．ローダプログラムの
ファイルメニューにて，前章で生成したロードモジュールファイルを指定し，
書込みボタンにてフラッシュROMへの書込みを行う．

4.1.4  sample1の実行

パソコンにシリアルターミナルを立ち上げてください．
設定は以下の通りです．

	・ボーレイト：19200bps
	・データ長：8 ビット．
	・ストップビット：1 ビット
	・パリティ：なし

Zup-F16拡張ボードの sw1 を B の反対側に設定して，Zup-F16拡張ボードの
電源をONにすると sample1 が実行されます．sample1 の詳細は sample1.c
ファイルのヘッダ部分を参照してください．

4.2  デバッカ

開発環境(TOSHIBA IDE)にはシミュレータデバッガが付属しているが，シリア
ル通信のシミュレーション設定などを工夫しない限り，カーネル起動時のログ
出力処理にて送信完了待ち状態のまま無限ループしてしまう．このため，シリ
アル通信機能を停止（少なくとも sys_config.c に実装されている sys_putc
の処理実態は無効）にして動作させることで，動作が可能である．なお，これ
はシミュレータデバッガでの動作を保障するものではない．

5  その他

5.1  ディレクトリ・ファイル構成

(1)   config/tlcs900-toshiba

	api.h					非ライブラリィ化のための定義
	cpu_config.c			TLCAS900 CPU依存部の C 関数
	cpu_config.h			TLCAS900 CPU依存部のカーネル用定義
	cpu_context.h			TLCAS900 CPU依存部のコンテキスト操作
	cpu_defs.h				TLCAS900 CPU依存部のアプリケーション用定義
	cpu_insn.h				TLCAS900 CPU依存部の低レベル関数
	cpu_rename.def			カーネルの内部識別名のリネームとその解除の定義リスト
	cpu_rename.h			カーネルの内部識別名のリネームの定義
	cpu_support.app			TLCAS900 CPU依存部のアセンブラ関数
	cpu_unrename.h			カーネルの内部識別名のリネーム解除の定義
	kernel_inline_defs.h	カーネル内部の inline 関数定義
	makeoffset.c			offset.inc 生成情報関数
	start.app				スタートアップモジュール
	tool_config.h			開発環境依存部のカーネル用定義
	tool_defs.h				開発環境依存部のアプリケーション用定義

(2)   config/tlcs900-toshiba/zup_f16_ex

	hw_serial.cfg	Zup-F16-ex用SIOドライバのコンフィギュレーションファイル
	hw_serial.h		Zup-F16-ex用SIOドライバ
	hw_timer.h		Zup-F16-ex用タイマ操作ルーチン
	sys_config.c	Zup-F16-exシステム依存部の C 関数
	sys_config.h	Zup-F16-exシステム依存部のカーネル用定義
	sys_defs.h		Zup-F16-exシステム依存部のアプリケーション用定義
	sys_rename.def	カーネルの内部識別名のリネームとその解除の定義リスト
	sys_rename.h	カーネルの内部識別名のリネームの定義
	sys_support.app	Zup-F16-exシステム依存部のアセンブラ関数
	sys_unrename.h	カーネルの内部識別名のリネーム解除の定義
	tmp91cy22.h		内蔵IO(SFR)および関連する定義
	uart.c			Zup-F16-ex用SIOドライバ実態の C 関数
	uart.h			Zup-F16-ex用SIOドライバ実態の定義
	zup_f16_ex.lcf	Zup-F16-ex用リンカコマンドファイル

(3)   tools/TLCS900-TOSHIBA

	TLCS900-TOSHIBA.tws	開発環境用ワークスペースファイル

(4)   utils/tlcs900-toshiba

	tlcs900_toshiba.dsw	ユーティリティ開発用ワークスペースファイル
	本階層の詳細は utils/tlcs900-toshiba にある readme.txt を参照．

以上

