- 履歴一覧
- ソース を表示
- Toppers/Devel は削除されています。
#navi(contents-page-name): No such page: Toppers
Counter: 0,
today: 0,
yesterday: 0
TOPPERSの環境構築†
お知らせ†
皆様
TOPPERS/JSPカーネル Release 1.4.1 の配布を開始しました.TOPPERSのWEBサ
イトから入手可能です.
http://www.toppers.jp/jsp-download.html
1.4からの変更点は
・細かいバグ修正(主にターゲット依存部)
・ターゲットサポートの追加(SH2,M16C,SC33,PowerPC32,Nios2)
です.
本田 晋也
豊橋技術科学大学/名古屋大学
TOPPERS概論†
コンパイルの流れ†
- コンフィギュレーションファイル(.cfg)に生成したいタスクの情報を書く
- 定義したタスクの処理本体である関数を(.c)に記述する。
プロトタイプは(.h)に記述する。
- コンフィギュレータがkernel_cfg.c, kernel_chk.c, kernel_id.hを生成する。
- make
システム構築の考え方†
- システム全体を機能ごとにサブシステムに分割。
- サブシステムの各部分ごとにタスクを割り当てる。
- TOPPERSを含むマルチタスクシステムにおけるタスクの実体は、単なる関数である。
- タスクを作るためにコンフィギュレーションファイルに登録
- 静的APIのCRE_TSKを使う
タスク管理機能†
生成したタスクの状態は以下のように変化する
- 生成したタスクを、まずDORMANT状態にする
- act_tskサービスコールの発行で、指定したタスクがREADY状態になる
起動時にREADY状態にするには、タスク生成オプション(CRE_TSK静的API内)でTA_ACTを指定する。
一般的には唯一のタスクを自動起動にして、そのタスクからサブシステムのタスクを起動すると良い。
- 設定された優先順位に従って、タスクがRUINNING状態になる
- タスクへ制御を移す。タスクの処理をした後、以下の選択肢がある
- DORMANT状態に移行する->ext_tsk
- WAITING状態(起床待ち)->slp_tsk
- WAITING状態(資源待ち)->wai_sem
- WAITING状態(イベント待ち)->wai_flg
- WAITING状態(メッセージ待ち)->rcv_dtq
タスク管理機能 |
CRE_TSK(ID tskid, {ATR tskatr, VP_INT exinf, FP task, PRI itskpri, SIZE stksz, VP stk}); | 静的API |
ER act_tsk(ID tskid); | タスク起動 |
ER iact_tsk(ID tskid); | タスク起動(タスク外で使用) |
ER_UINT can_act(ID tskid); | 処理要求キューの中にある、タスク起動要求のキャンセル |
void ext_tsk(void); | タスクの終了 |
ER ter_tsk(ID tskid); | タスクの強制終了(DORMANT状態になる) |
ER chg_pri(ID tskid, PRI tskpri); | タスク優先度の変更 |
ER get_pri(ID tskid, PRI *p_tskpri); | タスク優先度の参照 |
タスク付属同期機能 |
ER slp_tsk(void); | 起床待ち |
ER tslp_tsk(TMO tmout); | 起床待ち(タイムアウトあり) |
ER wup_tsk(ID tskid); | タスクの起床 |
ER iwup_tsk(ID tskid); | タスクの起床(タスク外で使用) |
ER_UINT can_wup(ID tskid); | タスクの起床要求を無効化 |
ER rel_wai(ID tskid); | 待ち状態の強制解除(READY状態になる) |
ER irel_wai(ID tskid); | 待ち状態の強制解除(READY状態になる)(タスク外で使用) |
ER sus_tsk(ID tskid); | 強制待ち状態への以降(WAITING状態になる) |
ER rsm_tsk(ID tskid); | 強制待ち状態からの強制再開(READY状態になる)、frsm_tskと同じ |
ER frsm_tsk(ID tskid); | 強制待ち状態からの再開(REDY状態になる)、rsm_tskと同じ |
ER dly_tsk(RELTIM dlytim); | 自タスクの遅延 |
タスク例外処理機能 |
DEF_TEX(ID tskid, {ATR texatr, FP texrtn}); | 静的API |
ER ras_tex(ID tskid, TEXPTN rasptn); | タスク例外処理の要求 |
ER iras_tex(ID tskid, TEXPTN rasptn); | タスク例外処理の要求(タスク外で使用) |
ER dis_tex(void); | タスク例外処理の禁止 |
ER ena_tex(void); | タスク例外処理の許可 |
BOOL sns_tex(void); | タスク例外処理の禁止状態の参照 |
- タスク外とは、ハンドラ内や拡張サービスルーチン内を指す。
- rel_waiからの起床の確認は、戻り値がE_RLWAIなのを確認する。
- sus_tskが多重に発生すると、発生回数だけネストする。。。TOPPERSでは最大ネスト1なので、実質的にネストしない。
- dly_tskは最小限の利用にとどめる
- タスク例外処理では、dis_texとena_texを使った排他制御が必要
同期・通信機能†
セマフォ |
CRE_SEM(ID semid, {ATR sematr, UINT isemcnt, UNIT maxsem}); | セマフォ生成の静的API |
ER sig_sem(ID semid); | セマフォの返却 |
ER isig_sem(ID semid); | セマフォの返却(タスク外) |
ER wai_sem(ID semid); | セマフォ獲得待ち |
ER pol_sem(ID semid); | セマフォのポーリング(WAITING状態にならない) |
ER twai_sem(ID semid, TMO tmout); | タイムアウト付きセマフォ獲得待ち |
イベント・フラグ |
CRE_FLG(ID flgid, {ATR flgatr, FLGPTN iflgptn;}); | イベント・フラグ生成の静的API |
ER set_flg(ID flgid, FLGPTN setptn); | イベント・フラグのセット |
ER iset_flg(ID flgid, FLGPTN setptn); | イベント・フラグのセット(タスク外) |
ER clr_flg(ID flgid, FLGPTN clrptn); | イベント・フラグのクリア |
ER wai_flg(ID flgid, FLGPTN waiptn, MODE wfmode, FLGPTN *p_flgptn); | イベント・フラグ待ち |
ER pol_flg(ID flgid, FLGPTN waiptn, MODE wfmode, FLGPTN *p_flgptn); | ポーリング(WAITING状態にならない) |
ER twai_flg(ID flgid, FLGPTN waiptn, MODE wfmode, FLGPTN *p_flgptn, TMO tmout); | タイムアウト付き待ち |
データ・キュー |
CRE_DTQ(ID dtqid, {ATR dtqatr, UINT dtqcnt, VP dtq}); | データ・キュー生成の静的API |
ER snd_dtq(ID dtqid, VP_INT data); | データキューへの送信 |
ER psnd_dtq(ID dtqid, VP_INT data); | ポーリング送信(WAITING状態にならない) |
ER ipsnd_dtq(ID dtqid, VP_INT data); | ポーリング送信(タスク外) |
ER tsnd_dtq(ID dtqid, VP_INT data, TMO tmout); | タイムアウト送信 |
ER fsnd_dtq(ID dtqid, VP_INT data); | 強制送信 |
ER ifsnd_dtq(ID dtqid, VP_INT data); | 強制送信(タスク外) |
ER rcv_dtq(ID dtqid, VP_INT *p_data); | データ・キューの受信 |
ER prcv_dtq(ID dtqid, VP_INT *p_data); | ポーリング受信 |
ER trcv_dtq(ID dtqid, VP_INT *p_data, TMO tmout); | タイムアウト受信 |
メール・ボックス |
CRE_MBX(ID mbxid, {ATR mbxatr, PRI maxmpri, VP mprihd}); | メール・ボックス生成の静的API |
ER snd_mbx(ID mbxid, T_MSG *pk_msg); | メール・ボックスへの送信 |
ER rcv_mbx(ID mbxid, T_MSG **ppk_msg); | メール・ボックスからの受信 |
ER prcv_mbx(ID mbxid, T_MSG **ppk_msg); | ポーリング受信 |
ER trcv_mbx(ID mbxid, T_MSG **ppk_msg, TMO tmout); | タイムアウト受信 |
- 排他制御が小さな範囲に収まるように設計する。
- セマフォIDを識別子として利用->同一IDでないと獲得、返却ができないので不可。
- セマフォはカウンタでもある
- デッドロック(kiss of death)の回避
- 排他制御で使用するリソースをひとつにまとめる(処理速度を検討して可能なら)
- 使用しているセマフォIDの一覧を作成しておく
- セマフォ資源を獲得する順序を規定する
- 競合する場合の条件(いつ、どこで)を規定しておく
- 機能追加した場合は、従来との整合性を明文化しておく
- CRE_SEMのsematrはセマフォ獲得待ちの順序を設定する。
TA_TFIFO(獲得待ちに入った順序)、TA_TPRI(タスクの優先度の順序)
- CRE_SEMのisemcntとmaxsemは、セマフォの初期値と最大値を示す。
初期値を0にすると起動時にwai_semで止まる
- CRE_FLGのflgatrで有効なのはTA_WSGLのみ
- set_flg (iset_flg)で指定したビットパターンは、現在のイベントフラグにORして格納される
(イベントフラグは、ビットの立上りのみ有効)
- clr_flgは、現在のイベントフラグとANDするので、マスクパターンを指定する
- wai_flgは、ひとつのタスクしか実行できない。E_ILUSEを返す。
- データ・キューは送信側タスクがWAITINGにならないように設計する
- データ・キューへの強制送信は、データの消失に注意
- データ・キューを通信バッファに流用する場合
- 単純なリングバッファよりもオーバヘッドがある
- 16ビット長であること
- メールボックスは、タスク間を対象とするため、ixxx_yyyは用意されていない。
- システム全体で、なるべく共通した通信手段を利用する観点では、メールボックスが適している
- メールボックスの使い方
- メッセージを全部書いてからsnd_mbxする
- 送信側でメモリブロックを開放しない
- メモリブロックの確保と開放はアプリで行う
- trcv_mbxのTMO_POLはprecv_mbxと同じ、TMO_FEVRはrecv_mbxと同じ
(ちょっとだけコードが小さくなる)
メモリプール管理機能†
固定長メモリプール管理機能 |
CRE_MPF(ID mpfid, {ATR mpfatr, UINT blkcnt, UINT blksz, VP mpf}); | メモリプールの生成(静的API) |
ER get_mpf(ID mpfid, VP *p_blk); | 獲得 |
ER pget_mpf(ID mpfid, VP *p_blk); | ポーリング獲得 |
ER tget_mpf(ID mpfid, VP *p_blk, TMO tmout); | タイムアウト獲得 |
ER rel_mpf(ID mpfid, VP blk); | 返却 |
システム状態管理機能†
μITRON4.0仕様 |
ER rot_rdq(PRI tskpri); | タスクの優先順位の回転 |
ER irot_rdq(PRI tskpri); | タスクの優先順位の回転(タスク外) |
ER get_tid(ID *p_tskid); | 実行状態のタスクIDの参照 |
ER iget_tid(ID *p_tskid); | 実行状態のタスクIDの参照(タスク外) |
ER loc_cpu(void); | CPUロック状態への移行 |
ER iloc_cpu(void); | CPUロック状態への移行(タスク外) |
ER unl_cpu(void); | CPUロック状態の解除 |
ER iunl_cpu(void); | CPUロック状態の解除 |
ER dis_dsp(void); | ディスパッチ(READYをRUNNINGにする)の禁止 |
ER ena_dsp(void); | ディパッチの許可 |
BOOL sns_ctx(void); | コンテキストの参照 |
BOOL sns_loc(void); | CPUロック状態の参照 |
BOOL sns_dsp(void); | ディスパッチ禁止状態の参照 |
BOOL sns_dpn(void); | ディスパッチ保留状態の参照 |
TOPPERS/JSP |
BOOL vsns_ini(void); | カーネル動作状態の参照 |
割込み管理機能†
割込み管理機能 |
DEF_INH(INHNO inhno, {ATR inhatr, FP inthdr}); | 割込みハンドラの定義(静的API) |
DEF_EXC(EXCNO excno, {ATR excatr, FP exchdr}); | CPU例外ハンドラの定義(静的API) |
そのほかの処理†
その他の処理 |
ATT_INI({ATR iniatr, VP_INT exinf, FP inirtn}); | 初期化ルーチンの追加(静的API) |
VATT_TER({ATR teratr, VP_INT exinf, FP terrtn}); | 終了処理ルーチンの追加(静的API) |
main()とコンフィギュレータ†
そもそも組込みソフトでmain()は意味が無い。
最初のタスクの起動は、静的に(コンパイル時に)行う。
静的に行うのは面倒なので、コンフィギュレータが導入された。
コンフィギュレーションファイル(.cfg)の記述は静的APIを使う。
sample1.cfgを参照すると良い。
/*
* @(#) $Id: sample1.cfg,v 1.7 2003/01/06 08:08:26 hiro Exp $
*/
/*
* サンプルプログラム(1)のシステムコンフィギュレーションファイル
*/
#define _MACRO_ONLY
#include "sample1.h"
INCLUDE("\"sample1.h\"");
CRE_TSK(TASK1, { TA_HLNG, (VP_INT) 1, task, MID_PRIORITY, STACK_SIZE, NULL });
CRE_TSK(TASK2, { TA_HLNG, (VP_INT) 2, task, MID_PRIORITY, STACK_SIZE, NULL });
CRE_TSK(TASK3, { TA_HLNG, (VP_INT) 3, task, MID_PRIORITY, STACK_SIZE, NULL });
CRE_TSK(MAIN_TASK, { TA_HLNG|TA_ACT, 0, main_task, MAIN_PRIORITY,
STACK_SIZE, NULL });
DEF_TEX(TASK1, { TA_HLNG, tex_routine });
DEF_TEX(TASK2, { TA_HLNG, tex_routine });
DEF_TEX(TASK3, { TA_HLNG, tex_routine });
CRE_CYC(CYCHDR1, { TA_HLNG, 0, cyclic_handler, 2000, 0 });
#ifdef CPUEXC1
DEF_EXC(CPUEXC1, { TA_HLNG, cpuexc_handler} );
#endif /* CPUEXC1 */
#include "../systask/timer.cfg"
#include "../systask/serial.cfg"
#include "../systask/logtask.cfg"
周期起動タスク†
- 周期ハンドラ
登録した関数を設定した時間間隔でカーネルが呼び出す。
- 静的API CRE_CYC()で周期ハンドラをカーネルに登録(起動間隔も設定する)
コンフィギュレーションファイル:
CRE_CYC(CYCHDR1, {TA_HLNG|TA_STA, 0, cyclic_handler, PERIOD_TIME, 0});
TA_HLNGは周期ハンドラがC言語で書かれていることを示し、
TA_STAは周期ハンドラを動作している状態にする
- 周期ハンドラ内の処理
- 複数のタスクでの周期ハンドラの共有
周期ハンドラには引数がひとつ渡せるので、
タスクIDを渡して周期ハンドラを使いまわせる。
起動周期が異なる処理が複数あっても、
タスク毎に周期ハンドラを用意する必要がないので、
メモリの節約になる。
コンフィギュレーションファイル:
CRE_CYC(CYCHDR1, {TA_HLNG|TA_STA, (VP_INT)TASK_ID1, cyclic_handler, PERIOD_TIME1, 0});
CRE_CYC(CYCHDR2, {TA_HLNG|TA_STA, (VP_INT)TASK_ID2, cyclic_handler, PERIOD_TIME2, 0});
周期ハンドラ:
void cyclic_handler(VP_INT task_id)
{
iwup_tsk((ID)task_id);
}
起床されるタスク1
void task1(VP_INT exinf)
{
while(1){
slp_tsk();
周期的に行いたい処理
}
}
起床されるタスク2
void task2(VP_INT exinf)
{
while(1){
slp_tsk();
周期的に行いたい処理
}
}
メールボックスの使い方†
- メールのデータ構造のポインタ渡しは、T_MSG **型になる。
- メモリプールを使用して、送り側のデータ更新から受信データを保護する
- 送信タスク
VP p;
get_mpf(MPF_ID, &p);
((MESSAGE*)p)->data=xxxxxx;
snd_mbx(MBX_ID, p);
- 受信タスク
MESSAGE *p;
rcv_mbx(MBX_ID, (T_MSG**)&p);
色々処理
rel_mpf(MPF_ID, (VP)p);
割込みハンドラからタスクへの情報通知†
- タスク起動
- 割込みハンドラ内でiact_tskする。
- タスクはDORMANT状態からREADY状態になる。
- タスクでは色々処理した後ext_tskする。
- タスクはRUNNING状態からDORMANT状態になる。
- タスクスタックを開放できる。
- コンテキストを保存する必要がない。
- 通知できるのはイベント発生のみ。
- 1回までの処理要求をキューイング
- タスク起床
- 割込みハンドラ内でiwup_tskする。
- タスクはWAITING状態(起床待ち)からREADY状態になる。
- タスクはslp_tskから抜け、色々処理した後slp_tskに戻る。
- タスクはRUNNING状態からWAITING状態(起床待ち)になる
- オーバヘッドが小さい
- 通知できるのはイベント発生のみ
- 1回までの処理要求をキューイング
- セマフォ
- 割込みハンドラ内でisig_semする。
- タスクはWAITING状態(資源待ち)からREADY状態になる
- タスクはwai_semから抜け、色々処理した後wai_semに戻る
- タスクはRUNNING状態からWAITING状態(資源待ち)になる。
- 処理要求の最大キューイング数を調整できる
- 受け側のタスクを複数個用意できる
- 通知できるのはイベント発生のみ
- イベントフラグ
- 割込みハンドラ内でiset_flgする
- タスクはWAITING状態(イベント待ち)からREADY状態になる。
- タスクはwai_flgから抜け、色々処理した後wai_flgに戻る
- タスクはRUNNING状態からWAITING状態(イベント待ち)になる。
- 通知できるのはイベント発生とビットパターン
- ビットパターンを使って複数のイベントを待つことが出来る(AND, OR設定可能)
- 1回までの処理要求をキューイング
- データキュー
- 割込みハンドラ内でipsnd_dtqする。
- タスクはWAITING状態(メッセージ待ち)からREADY状態になる。
- タスクはrcv_dtqから抜け、色々処理した後rcv_dtqに戻る。
- タスクはRUNNING状態からWAITING状態(イベント待ち)になる。
- 処理要求の最大キューイング数はデータキューのサイズ
- 通知できるのは1ワードデータ
シリアルインターフェースドライバ†
- コンフィギュレーションファイルにserial.cfgをインクルード
サービスコール |
ER serial_opn_por(ID portid); | ポートをオープンする |
ER serial_cls_por(ID portid); | ポートをクローズする |
ER_UINT serial_rea_dat(ID portid, char *buf, UINT len); | ポートから受信 |
ER_UNIT serial_wri_dat(ID portid, char *buf, UINT len); | ボートへ送信 |
ER serial_ctl_por(ID portid, UINT ioctl); | ポートの設定 |
ER serial_ref_por(ID portid, T_SERAL_RPOR *pk_rpor); | ポートの状態を取得 |
- ioctlのビットパターン
- IOCTL_ECHO (エコーバックモード)
- IOCTL_CRLF (改行モードをCR+LFにする)
- IOCTL_FCSND (送信時のXON/XOFFフロー制御)
- IOCTL_FCRCV (受信時のXON/XOFFフロー制御)
コンパイル方法†
ファイルのダウンロード†
カーネルcfgソフトウエア作成†
cd jsp/cfg
make depend
make
サンプルプログラムの構築†
あまり用はない気がするコンパイルの確認やプログラム作成方法の習得に重要
jsp直下で下記を実行
mkdir akih8 //適当なディレクトリ
cd akih8
../configure -C h8 -S akih8_3069f
sample1.hとsample1.cが生成される。sample1.cは下記の機能を持つ
/*
* サンプルプログラム(1)の本体
*
* JSPカーネルの基本的な動作を確認するためのサンプルプログラム.
*
* プログラムの概要:
*
* ユーザインタフェースを受け持つメインタスク(タスクID: MAIN_TASK,
* 優先度: MAIN_PRIORITY)と,三つの並列実行されるタスク(タスクID:
* TASK1〜TASK3,初期優先度: MID_PRIORITY)で構成される.また,起動周
* 期が2秒の周期ハンドラ(周期ハンドラID: CYCHDR1)を用いる.
*
* 並列実行されるタスクは,task_loop 回空ループを実行する度に,タスク
* が実行中であることをあらわすメッセージを表示する.
*
* 周期ハンドラは,三つの優先度(HIGH_PRIORITY,MID_PRIORITY,
* LOW_PRIORITY)のレディキューを回転させる.プログラムの起動直後は,
* 周期ハンドラは停止状態になっている.
*
* メインタスクは,シリアルI/Oポートからの文字入力を行い(文字入力を
* 待っている間は,並列実行されるタスクが実行されている),入力された
* 文字に対応した処理を実行する.入力された文字と処理の関係は次の通り.
* Control-C または 'Q' が入力されると,プログラムを終了する.
*
* '1' : 以降のコマンドは TASK1 に対して行う.
* '2' : 以降のコマンドは TASK2 に対して行う.
* '3' : 以降のコマンドは TASK3 に対して行う.
* 'a' : タスクを act_tsk により起動する.
* 'A' : タスクに対する起動要求を can_act によりキャンセルする.
* 'e' : タスクに ext_tsk を呼び出させ,終了させる.
* 't' : タスクを ter_tsk により強制終了する.
* '>' : タスクの優先度を HIGH_PRIORITY にする.
* '=' : タスクの優先度を MID_PRIORITY にする.
* '<' : タスクの優先度を LOW_PRIORITY にする.
* 'G' : タスクの優先度を get_pri で読み出す.
* 's' : タスクに slp_tsk を呼び出させ,起床待ちにさせる.
* 'S' : タスクに tslp_tsk(10秒) を呼び出させ,起床待ちにさせる.
* 'w' : タスクを wup_tsk により起床する.
* 'W' : タスクに対する起床要求を can_wup によりキャンセルする.
* 'l' : タスクを rel_wai により強制的に待ち解除にする.
* 'u' : タスクを sus_tsk により強制待ち状態にする.
* 'm' : タスクの強制待ち状態を rsm_tsk により解除する.
* 'M' : タスクの強制待ち状態を frsm_tsk により強制解除する.
* 'd' : タスクに dly_tsk(10秒) を呼び出させ,時間経過待ちにさせる.
* 'x' : タスクにパターン 0x0001 の例外処理を要求する.
* 'X' : タスクにパターン 0x0002 の例外処理を要求する.
* 'y' : タスクに dis_tex を呼び出させ,タスク例外を禁止する.
* 'Y' : タスクに ena_tex を呼び出させ,タスク例外を許可する.
* 'r' : 三つの優先度(HIGH_PRIORITY,MID_PRIORITY,LOW_PRIORITY)の
* レディキューを回転させる.
* 'c' : 周期ハンドラを動作させる.
* 'C' : 周期ハンドラを停止させる.
* 'z' : CPU例外を発生させる.
* 'Z' : CPUロック状態でCPU例外を発生させる(プログラムを終了する).
* 'V' : vxget_tim で性能評価用システム時刻を2回読む.
* 'v' : 発行したシステムコールを表示する(デフォルト).
* 'q' : 発行したシステムコールを表示しない.
*/
TINETコンフィギュレータを生成する†
cd jsp/tinet/cfg
make
nservのコンパイル†
cd jsp/nserv
make tinet
make depend
make
高橋メモ†
FDAU TOPPERS memo 2004/9/29 takahashi
- target
AKI-H8/3069F-LAN
CPU: H8-3069F CLK20MHz MODE5
ROM: 内蔵512KB 000000h-007FFFh
RAM: 内蔵 16KB FFBF20h-FFFF1Fh
RAM: 外部DRAM 8bit幅 CS2 2MB 400000h-5FFFFFh
RS232C: SCI0(JP1、線を引き出しDsub9を半田付け), SCI1(Dsub9)
LAN: RTL8019AS 8bit幅 CS1 32B 200000h-20001Fh
- tool-chains
elf形式の、CとC++のコンパイラをつくろうとしたが、
コンパイルできなかったので、あきらめる。
coff形式のCコンパイラを作成する。
TOPPERS/JSP kernel をコンパイルするには、これがあればいいらしい。
Cygwin環境にて構築
binutils-2.13.2.tar.bz2
gcc-3.2.1-core.tar.bz2
h8300-hms-gcc-3.1-1.patch http://h8300-hms.sourceforge.net/
newlib-1.11.0.tar.gz
gdb-5.2.1.tar.bz2
- binutils
オプション --disable-nls (国際化メッセージ無効)はTOPPERS/JSPのカーネルの
コンパイルに必要。
tar xfj binutils-2.13.2.tar.bz2
cd binutils-2.13.2
mkdir objdir
cd objdir
../configure --prefix=/usr/local --target=h8300-hms --disable-nls
make CFLAGS="-O2 -fomit-frame-pointer" all
make install
- gcc and newlib
Cコンパイラ以外は必要ないのでgcc-coreを使う。
newlibは組み込み用ライブラリ
コンパイルには、かなり時間がかかる。
export PATH=$PATH:/usr/local/bin
tar xfj gcc-3.2.1-core.tar.bz2
tar xfz newlib-1.11.0.tar.gz
cd gcc-3.2.1
ln -s ../newlib-1.11.0/newlib .
patch -p1 < ../h8300-hms-gcc-3.1-1.patch
mkdir objdir
cd objdir
../configure \
--prefix=/usr/local --target=h8300-hms \
--enable-languages=c --with-newlib
make CFLAGS="-O2 -fomit-frame-pointer" all
make install
- gdb
TOPPERS/JSPカーネル構築に必要ないので後回しにしてよい。
GDBのソースコードを展開したディレクトリ以下の
./gdb/config/h8300/tm-h8300.h を以下のように修正
L62 #define TARGET_INT_BIT 32
L155 #define ARGLAST_REGNUM 1
tar xfj gdb-5.2.1.tar.bz2
cd gdb-5.2.1
mkdir objdir
cd objdir
../configure --prefix=/usr/local --target=h8300-hms
make CFLAGS="-O2 -fomit-frame-pointer" all
make install
- TOPPERS/JSP kernel
jsp-1.4.tar.gzを入手する。
http://www.toppers.jp/jsp-download.html
documentはjsp/docにある。
とりあえずコンパイルしてみる。
最初にjsp/cfgに移動し、make
cfg(.exe) と chk(.exe) を生成する。
cd ../
mkdir akih83hms
cd akih83hms
../configure -C h8 -S akih8_3069f
でコンフィグレーションされる。
configureはperlスクリプトなのでperlつかえないとダメ。
make depend
make
で、カーネル(jsp.exeとjsp.srec)がmakeされる。
- TOPPERS/JSP-tinet
tinet-1.2.tar.gzを入手する。