#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
できあがり??


トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS