#navi(Toppers) #counter #contents -[[TOPPERSプロジェクト:http://www.toppers.jp/]] -[[TOPPERS/JSPカーネル:http://www.mit.pref.miyagi.jp/embedded/TOPPERS/]] -[[GNUクロス開発環境構築の解説(pdf):http://www.fitpost.jp/mc_ouyou/cross.pdf]] * TOPPERSの環境構築 [#jcf33b8e] *お知らせ [#sabcd8f3] -TOPPERS-MLより 皆様 TOPPERS/JSPカーネル Release 1.4.1 の配布を開始しました.TOPPERSのWEBサ イトから入手可能です. http://www.toppers.jp/jsp-download.html 1.4からの変更点は ・細かいバグ修正(主にターゲット依存部) ・ターゲットサポートの追加(SH2,M16C,SC33,PowerPC32,Nios2) です. 本田 晋也 豊橋技術科学大学/名古屋大学 //------------------------------------------------------------- ---- *TOPPERS概論 [#we91f170] **コンパイルの流れ [#v4a83f90] +コンフィギュレーションファイル(.cfg)に生成したいタスクの情報を書く +定義したタスクの処理本体である関数を(.c)に記述する。 プロトタイプは(.h)に記述する。 +コンフィギュレータがkernel_cfg.c, kernel_chk.c, kernel_id.hを生成する。 +make **システム構築の考え方 [#c8e9d507] -システム全体を機能ごとにサブシステムに分割。 -サブシステムの各部分ごとにタスクを割り当てる。 -TOPPERSを含むマルチタスクシステムにおけるタスクの実体は、単なる関数である。 -タスクを作るためにコンフィギュレーションファイルに登録 -静的APIのCRE_TSKを使う **タスク管理機能 [#v9d164ff] 生成したタスクの状態は以下のように変化する +生成したタスクを、まず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 |>|LEFT:~タスク管理機能| |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);|タスク優先度の参照| |>|LEFT:~タスク付属同期機能| |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);|自タスクの遅延| |>|LEFT:~タスク例外処理機能| |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を使った排他制御が必要 **同期・通信機能 [#t3f8454f] |>|LEFT:~セマフォ| |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);|タイムアウト付きセマフォ獲得待ち| |>|LEFT:~イベント・フラグ| |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);|タイムアウト付き待ち | |>|LEFT:~データ・キュー| |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);|タイムアウト受信 | |>|LEFT:~メール・ボックス| |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と同じ (ちょっとだけコードが小さくなる) **メモリプール管理機能 [#k55c53ae] |>|LEFT:~固定長メモリプール管理機能| |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);|返却| -可変長メモリプールは実装なし **システム状態管理機能 [#h7056797] |>|LEFT:~μ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);|ディスパッチ保留状態の参照| |>|LEFT:~TOPPERS/JSP| |BOOL vsns_ini(void);|カーネル動作状態の参照| **割込み管理機能 [#xd33a6f6] |>|LEFT:~割込み管理機能| |DEF_INH(INHNO inhno, {ATR inhatr, FP inthdr});|割込みハンドラの定義(静的API)| |DEF_EXC(EXCNO excno, {ATR excatr, FP exchdr});|CPU例外ハンドラの定義(静的API)| **そのほかの処理 [#f44fa7fd] |>|LEFT:~その他の処理| |ATT_INI({ATR iniatr, VP_INT exinf, FP inirtn});|初期化ルーチンの追加(静的API)| |VATT_TER({ATR teratr, VP_INT exinf, FP terrtn});|終了処理ルーチンの追加(静的API)| **main()とコンフィギュレータ [#r1054778] そもそも組込みソフトで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" **周期起動タスク [#ic61edeb] -周期ハンドラ~ 登録した関数を設定した時間間隔でカーネルが呼び出す。 --静的API CRE_CYC()で周期ハンドラをカーネルに登録(起動間隔も設定する) コンフィギュレーションファイル: CRE_CYC(CYCHDR1, {TA_HLNG|TA_STA, 0, cyclic_handler, PERIOD_TIME, 0}); TA_HLNGは周期ハンドラがC言語で書かれていることを示し、~ TA_STAは周期ハンドラを動作している状態にする --周期ハンドラ内の処理 ---処理が短い場合~ 周期ハンドラ内で処理してしまう 周期ハンドラ: void cychdr(VP_INT exinf) { 周期的に行いたい処理 } ---処理が長い場合~ 周期ハンドラは、実際に周期処理を行うタスクに通知するだけとする。 周期ハンドラ: void cyclic_handler(VP_INT exinf) { iwup_tsk(TASK_ID); } 通知される側のタスク: void task(VP_INT exinf) { while(1){ slp_tsk(); 周期的に行いたい処理 } } -複数のタスクでの周期ハンドラの共有~ 周期ハンドラには引数がひとつ渡せるので、 タスク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(); 周期的に行いたい処理 } } **メールボックスの使い方 [#da5e5fce] -メールのデータ構造のポインタ渡しは、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); **割込みハンドラからタスクへの情報通知 [#g34da921] -タスク起動 --割込みハンドラ内で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ワードデータ **シリアルインターフェースドライバ [#gaeb0de9] -コンフィギュレーションファイルにserial.cfgをインクルード |>|LEFT:~サービスコール| |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フロー制御) //----------------------------------------------------------------------- ---- *コンパイル方法 [#h45fec13] **ファイルのダウンロード [#vacdba34] -%%[[sourceforge:http://sourceforge.net/project/showfiles.php?group_id=24580]]から%% %%h8300-hms-gcc-3.3-0.1.i386.rpmをダウンロード。%%~ %%gcc-3.3からbinutilsとnewlibは同梱されたらしい。%%~ TOPPERSコンパイル時はWARNINGとchkでエラーになる。 gcc自体のコンパイルが王道。 -[[ftp://ftp.ring.gr.jp/pub/GNU/]]あたりから --gcc-core-3.2.1.tar.bz2 --binutils-2.13.2.tar.bz2 -[[http://sourceforge.net/project/showfiles.php?group_id=24580]]から --h8300-hms-gcc-3.1-1.patch -[[http://sources.redhat.com/newlib/]]から --newlib-1.11.0.tar.gz -TOPPERSのダウンロード --[[http://www.toppers.jp/jsp-download.html]]からダウンロード ---jsp-1.4.tar.gz ---tinet-1.2.tar.gz **カーネルcfgソフトウエア作成 [#z2348a89] cd jsp/cfg make depend make **サンプルプログラムの構築 [#yc20a200] %%あまり用はない気がする%%コンパイルの確認やプログラム作成方法の習得に重要~ 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コンフィギュレータを生成する [#mc960fdf] cd jsp/tinet/cfg make **nservのコンパイル [#i79e982f] cd jsp/nserv make tinet make depend make **高橋メモ [#h8c4f385] 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カーネル構築に必要ないので後回しにしてよい。 #br GDBのソースコードを展開したディレクトリ以下の ./gdb/config/h8300/tm-h8300.h を以下のように修正 L62 #define TARGET_INT_BIT 32 L155 #define ARGLAST_REGNUM 1 #br 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を入手する。 -http://www.toppers.jp/tinet.html jspに展開する。 documentはjsp/tinet/docにある。 とりあえずコンパイルしてみる。 #br jsp/tinet/cfgに移動し、make tinet_cfg(.exe) を生成する。 cd ../../ mkdir akih83hms-net cd akih83hms-net ../configure -C h8 -S akih8_3069f でコンフィグレーションされる。 #br jsp/nservに移動 $ make tinet $ make depend $ make できあがり??