基本的には文末のほうが古い情報です。
TOPPERS ユーザの皆様 苫小牧高専、情報工学科の阿部です。 TINET リリース 1.2 に、重要な問題が発見されました。影響するのは リトルエンディアンのプロセッサです。このため、 TOPPERS プロジェクトと、宮城県産業技術センター様の ホームページから、TINET リリース 1.2.1 の配布を開始させていただきます。 URL は、 TINETとは(TOPPERS プロジェクト) http://www.toppers.jp/tinet.html ダウンロード(TOPPERS プロジェクト) http://www.toppers.jp/tinet-download.html ダウンロード(宮城県産業技術センター様) http://www.mit.pref.miyagi.jp/embedded/consortium/ となっております。 変更点等は、それぞれのドキュメントを参照してください。 皆様から、問題点だけではなく、ご要望もお待ちしております。 それでは、よろしくお願いいたします。 -- .\" 苫小牧工業高等専門学校 情報工学科 教授 阿部 司 .\" E-mail: abe@jo.tomakomai-ct.ac.jp TEL/FAX: 0144-67-8937
皆様 TOPPERS/JSPカーネル Release 1.4.1 の配布を開始しました.TOPPERSのWEBサ イトから入手可能です. http://www.toppers.jp/jsp-download.html 1.4からの変更点は ・細かいバグ修正(主にターゲット依存部) ・ターゲットサポートの追加(SH2,M16C,SC33,PowerPC32,Nios2) です. 本田 晋也 豊橋技術科学大学/名古屋大学
生成したタスクの状態は以下のように変化する
タスク管理機能 | |
---|---|
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); | タスク例外処理の禁止状態の参照 |
セマフォ | |
---|---|
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); | タイムアウト受信 |
μ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()は意味が無い。
最初のタスクの起動は、静的に(コンパイル時に)行う。
静的に行うのは面倒なので、コンフィギュレータが導入された。
コンフィギュレーションファイル(.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"
コンフィギュレーションファイル: CRE_CYC(CYCHDR1, {TA_HLNG|TA_STA, 0, cyclic_handler, PERIOD_TIME, 0});TA_HLNGは周期ハンドラがC言語で書かれていることを示し、
周期ハンドラ: void cychdr(VP_INT exinf) { 周期的に行いたい処理 }
周期ハンドラ: void cyclic_handler(VP_INT exinf) { iwup_tsk(TASK_ID); } 通知される側のタスク: void task(VP_INT exinf) { while(1){ slp_tsk(); 周期的に行いたい処理 } }
コンフィギュレーションファイル: 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(); 周期的に行いたい処理 } }
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);
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' : 発行したシステムコールを表示しない. */
cd jsp/tinet/cfg make
cd jsp/nserv make tinet make depend make
FDAU TOPPERS memo 2004/9/29 takahashi
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
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
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
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
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
cd ../ mkdir akih83hms cd akih83hms ../configure -C h8 -S akih8_3069fでコンフィグレーションされる。 configureはperlスクリプトなのでperlつかえないとダメ。
make depend makeで、カーネル(jsp.exeとjsp.srec)がmakeされる。
cd ../../ mkdir akih83hms-net cd akih83hms-net ../configure -C h8 -S akih8_3069fでコンフィグレーションされる。
$ make tinet $ make depend $ makeできあがり??