組み込み型リアルタイム・マイクロ・カーネル
【概要】
このカーネルは、μITRON3.0を目指して作成していますが、 レベルRに達していないので、μITRON3.0とは呼べません。 もっとも、性能的にリアルタイム性に欠けているので、μITRON3.0 と呼べる日は来ないでしょう。 また、リリース0.07をもってひとまず終了です。(内容的には0.06c の方が安定していますが)次は、μITRON4.0だからか...
【目次】
1.動作条件 ▽ 2.サポートシステムコール ▽ 3.使用方法 ▽ 3- 1. カーネル起動 (vini_rtmk) ▽ 3- 2. タスク生成 (cre_tsk) ▽ 3- 3. タスク起動 (sta_tsk) ▽ 3- 4. ディスパッチ禁止 (dis_dsp) ▽ 3- 5. ディスパッチ許可 (ena_dsp) ▽ 3- 6. タスクのレディキュー回転 (rot_rdq) ▽ 3- 7. 自タスクのタスクID参照 (get_tid) ▽ 3- 8. 自タスクを起床待ち状態へ移行 (slp_tsk,tslp_tsk) ▽ 3- 9. 他タスクの起床 (wup_tsk) ▽ 3-10. 割り込みハンドラから復帰 (ret_int) ▽ 3-11. 割り込みとディスパッチ禁止 (loc_cpu) ▽ 3-12. 割り込みとディスパッチ許可 (unl_cpu) ▽ 3-13. タスク遅延 (dly_tsk) ▽ 3-14. システム状態参照 (ref_sys) ▽ 3-15. 自タスク終了 (ext_tsk) ▽ 3-16. 自タスクの終了と削除 (exd_tsk) ▽ 3-17. 例外ハンドラ定義 (def_exc) ▽ 3-18. 他タスク強制終了 (ter_tsk) ▽ 3-19. タスクの起床要求を無効化 (can_wup) ▽ 3-20. 割り込みハンドラ復帰とタスク起床 (ret_wup) ▽ 3-21. 割り込みハンドラ定義 (def_int) ▽ 4.配布内容 ▽ 4- 1. カーネル ▽ 4- 2. CPUのCCR操作関数 ▽ 4- 3. LCD表示ドライバ ▽ 4- 4. セットアップ ▽ 4- 5. サンプルファイル ▽ 5.組み込み手順 ▽ 6.注意事項 ▽ 7.その他 ▽
1.動作条件
AKI-H8マイコン専用Cコンパイラ(C38HAB.LIBをリンク) タイマーを1チャンネル使用(1mSecインターバル用) ※ディスパッチには、setjmp, longjmp を使用しています。 C38HAB.LIB のバージョンによっては、コードが異なる場合が あるかもしれません。その場合は、動作しませんので、諦め てください。(setjmp, longjmp に合わせて、カーネルを再構 築する必要があるのですが、ソースの提供はありません。)2.サポートシステムコール
レベルR,RN dis_dsp, ena_dsp, slp_tsk, loc_cpu, unl_cpu, ret_int, wup_tsk レベルS,SN ext_tsk, rot_rdq, get_tid, dly_tsk, sta_tsk, ter_tsk, can_wup レベルE,EN exd_tsk, tslp_tsk, ref_sys, cre_tsk, ret_wup レベルC def_exc, def_int ※ご注意! 接続機能はサポートしていません。また、ほとんどデバッグして いません。3.使用方法
このカーネルは、パーソナルメディアから発売されている 「μITRON3.0標準ハンドブック改定新版」 をもとに作成しています。システムコール等の使用方法は、そちらを 参照してください。3-1. カーネル起動 (vini_rtmk)
vini_rtmk: Vender Initialize Real Time Micro Kernel 【パラメータ】 ID tskid TaskId タスクID T_CTSK* pk_ctsk Packet to Create Task タスク生成情報 pk_ctskの内容 VP exinf Extended Information 拡張情報 ATR tskatr TaskAttribute タスク属性 FP task TaskStartAddress タスク起動アドレス PRI itskpri InitialTaskPriority タスク起動時優先度 INT stksz StackSize スタックサイズ(バイト数) -(☆以下はTCBとしてカーネルが使用する領域がある)- 【リターンパラメータ】 ER ercd ErrorCode エラーコード 【解説】 tskidで指定したID番号を持つユーザータスクを現在実行中の状態として 生成すると同時に、カーネルの初期化を行います。 対象タスクは生成後、RUN状態となります。 ※他の点は cre_tsk に準じていますので、ハンドブックをご参照ください。 【補足事項】 SETUP.MAR から、main をコールした時点ではまだ、カーネルは動作して いません。T_CTSK 構造体を確保して、パラメータをセットしてから、 vini_rtmk をコールします。 /* rtmk initialize */ main_task.exinf = NULL; /* 拡張情報(未指定) */ main_task.tskatr = TA_HLNG; /* 対象タスクが高級言語 */ main_task.task = main; /* スタートアドレス */ main_task.itskpri = 8; /* タスク優先順位 */ main_task.stksz = 512; /* スタック割り当てサイズ */ if ( vini_rtmk( MAIN_TASK, &main_task ) != E_OK ) return -1; vini_rtmk では、現在実行中の状態を1タスクとして組み込んで、 カーネルの使用するタイマーを起動します。 ここで使用した T_CTSK 構造体は、カーネル起動後にカーネルがそのま ま参照しています(TCBがこの構造体に含まれています)ので、他のタ スクの登録には、別途 T_CTSK 構造体を確保する必要があります。 カーネルの参照するアドレス等をスタートアップ等で定義してください。 _ITUx カーネルに割り当てるITUのアドレスを定義します。 (ITU0:H'ffff64,ITU1:H'ffff6e,ITU2:ffff78,ITU3:H'ffff82,ITU4:H'ffff92) _CNT1mS 1mSecのシステムクロックでのカウント値を定義します。 _STKtop スタックエリアの最下位アドレスを定義します。 _STKini スタックエリアの最上位アドレス+1を定義します。 .section C, DATA, ALIGN=2 .export _ITUx, _CNT1mS, _STKtop, _STKini _ITUx .data.l H'ffff6e ; カーネルの使用するITUを定義(ITU1) _CNT1mS .data.w 16000 ; 1mSec のカウント数を定義(φ=16MHz) _STKtop .data.l startof S ; スタック開始アドレス _STKini .data.l stack ; 割り当てスタック初期値 【エラーコード(ercd)】 E_OK 正常終了 E_SYS システムエラー(既にカーネル初期化済み) E_ID 不正ID番号(tskidが不正) E_PAR パラメータエラー(task,itskpri,stkszが不正)3-2. タスク生成 (cre_tsk)
【エラーコード(ercd)】 E_OK 正常終了 E_SYS システムエラー(カーネルが初期化されていない) E_ID 不正ID番号(tskidが不正) E_PAR パラメータエラー(task,itskpri,stkszが不正) ※他の点は、ハンドブックをご参照ください。3-3. タスク起動 (sta_tsk)
【エラーコード(ercd)】 E_OK 正常終了 E_ID 不正ID番号(tskidが不正) E_NOEXS オブジェクトが存在していない E_OBJ オブジェクトの状態が不正 ※他の点は、ハンドブックをご参照ください。3-4. ディスパッチ禁止 (dis_dsp)
※ハンドブックをご参照ください。3-5. ディスパッチ許可 (ena_dsp)
※ハンドブックをご参照ください。3-6. タスクのレディキュー回転 (rot_rdq)
【補足事項】 タスク独立部から rot_rdq(tskid=TPRI_RUN)を発行した場合は、その 時実行中のタスクを含むレディキューを回転します。ディスパッチが遅 延されている状態においては、ディスパッチが発行される直前の実行中 のタスクを含むレディーキューの回転となります。 ※他の点は、ハンドブックをご参照ください。3-7. 自タスクのタスクID参照 (get_tid)
※ハンドブックをご参照ください。3-8. 自タスクを起床待ち状態へ移行 (slp_tsk,tslp_tsk)
※ハンドブックをご参照ください。3-9. 他タスクの起床 (wup_tsk)
【エラーコード(ercd)】 E_OK 正常終了 E_ID 不正ID番号(tskidが不正) E_NOEXS オブジェクトが存在していない E_OBJ オブジェクトの状態が不正 E_OACV キューイングまたはネストのオーバーフロー ※他の点は、ハンドブックをご参照ください。3-10. 割り込みハンドラから復帰 (ret_int)
【補足事項】 a)rel.0.06c までに適用 ret_int は単なる return 文になっていますが、現在使い道はあり ません。 b)rel.0.07に適用 ret_int が、単なる return 文からディスパッチ実行関数にかわり ました。ただし、割り込みハンドラの先頭(割込み禁止状態)で、 vbgn_int をコールすることが必須です。 ※他の点は、ハンドブックをご参照ください。3-11. 割り込みとディスパッチ禁止 (loc_cpu)
※ハンドブックをご参照ください。3-12. 割り込みとディスパッチ許可 (unl_cpu)
※ハンドブックをご参照ください。3-13. タスク遅延 (dly_tsk)
※ハンドブックをご参照ください。3-14. システム状態参照 (ref_sys)
【エラーコード(ercd)】 E_OK 正常終了 E_SYS システムエラー(カーネルが初期化されていない) E_PAR パラメータエラー ※他の点は、ハンドブックをご参照ください。3-15. 自タスク終了 (ext_tsk)
【補足事項】 他のタスクがアクティブになるまで、スタック領域はカーネルが使用 しています。 ※他の点は、ハンドブックをご参照ください。3-16. 自タスクの終了と削除 (exd_tsk)
【補足事項】 他のタスクがアクティブになるまで、スタック領域はカーネルが使用 しています。 ※他の点は、ハンドブックをご参照ください。3-17. 例外ハンドラ定義 (def_exc)
【補足事項】 定義可能な例外ハンドラは、ter_tsk によるタスクの終了ハンドラの みです。タスク独立部から起動した場合は、エラーコード E_CTX を返 します。 ※他の点は、ハンドブックをご参照ください。3-18. 他タスク強制終了 (ter_tsk)
※ハンドブックをご参照ください。3-19. タスクの起床要求を無効化 (can_wup)
※ハンドブックをご参照ください。3-20. 割り込みハンドラ復帰とタスク起床 (ret_wup)
※ハンドブックをご参照ください。3-21. 割り込みハンドラ定義 (def_int)
【補足事項】 割り込みハンドラを静的に定義する場合は、このシステム コールを使用する必要はありません。動的に割り込みハンド ラを定義したい場合に使用します。 pk_dintのパケット形式の追加メンバinttblは、割り込み テーブルの先頭アドレスを格納します。割り込みアドレスを 静的に定義している場合は NULL とします。(NADRではない) また、追加メンバintiniが NULL (こちらもNADRではない)で 無い場合は、割り込み初期化ルーチンとして、def_intのな かから呼び出します。 尚、pk_dint=NADR=(-1)としても割り込みハンドラの定義 解除は行われませんので、ご注意ください。 ※他の点は、ハンドブックをご参照ください。 【実装例】 以下は例ですが、机上ですのでうまく行かないかもしれ ません。 ; 割り込みベクタ .section V, CODE, ALIGN=2 .org xxxx .data.l int_000 .org yyyy .data.l int_001 ; 割り込みテーブル .section D, DATA, ALIGN=2 .align 2 .export _int_tbl _int_tbl int_000 .res.l 1 int_001 .res.l 1 /* 割り込みハンドラ */ #pragma interrupt int_yyy void int_yyy( void ) { vbgn_int(); /* 必須 */ /* ここで、必要があれば割込み要求フラグ解除 */ /* ここで、実際の処理 */ ret_int(); /* 必須(またはret_wup(zz)) */ } /* 割り込みの初期化 */ void int_yyy_ini( void ) { /* ここで、割り込みの初期化 */ } /* 定義 */ #define INT_001 1 extern FP int_tbl[]; T_DINT dint; /* なにがしかの処理 */ dint.intatr = TA_HLNG; dint.inthdr = int_yyy; dint.inttbl = int_tbl; dint_intini = int_yyy_ini; def_int( INT_001, &dint ); /* なにがしかの処理 */4.配布内容
4-1. カーネル(kernel.obj, kernel.h, kernel.htm)
カーネル本体とそのヘッダファイルとこのファイルです。4-2. CPUのCCR操作関数(machine.obj, machine.h)
CPUのCCR操作関数とそのヘッダファイルです。 AKI-H8マイコン専用Cコンパイラには、CCR操作関数が含まれて いなかったので、一部拡張して作成しました。 set_ccr : CCRをセット get_ccr : CCRの状態を取得 and_ccr : CCRをアンドセット or_ccr : CCRをオアセット xor_ccr : CCRをエクスクルーシブオアセット get_and_ccr : CCRをアンドセット(操作前のCCRの状態を取得) get_or_ccr : CCRをオアセット(操作前のCCRの状態を取得) get_xor_ccr : CCRをエクスクルーシブオアセット (操作前のCCRの状態を取得)4-3. LCD表示ドライバ(lcddrv.obj, lcddrv.h)
LCDの表示ドライバとヘッダファイルです。 このドライバでは、時間待ちを dly_tsk システムコールを使用 していますので、カーネルの初期化後に実行する様にしてください。 対応制御コード 0x0d (CR) 復帰 0x0a (LF) 改行 ※ 2行目の最終を超えた場合は、自動的に復帰改行します。 エスケープ・シーケンス カーソル移動(ESC=lc) カーソルをl行cカラムに移動させます。 パラメータlとcは、バイナリで0x20の オフセットを付けて指定します。 1行目の1カラムの指定は文字列表記で、 "\x1b=\x21\x21" となります。 3行目以上または40カラム以上の指定 はそれぞれ1行目、1カラムになります。 CGRAM定義(ESCCa) CGRAMのアドレスaから続くデータを 書き込みます。 アドレスは、バイナリで0x40のオフセット を付けて指定します。 パターンデータは、MSBを1として与え ます。(制御コードの回避) データとして 0xff を与えるとこのシーケ ンスを終了して、以降はDDRAMへの通 常表示となります。( キャラクタコード は 0x80 から 0x87 です。) CGRAMの0をクリアするには、文字列 表記で、"\x1bC\x40\x80\x80\x80\x80\x80 \x80\x80\x80\xff" となります。 他の制御コードに対応していません。まだ、未完成です。 lcd_ini : 初期化 lcd_putc : 一文字出力 lcd_puts : 文字列出力4-4. セットアップ(setup.mar, system.h, ioregs.h)
セットアッププログラムソースと各種定義ヘッダファイルです。4-5. サンプルファイル(main.c, makefile)
サンプルソースと生成用メイクファイルです。5.組み込み手順
添付サンプル (setup.mar, main.c, makefile) をご覧ください。6.注意事項
デバックは行っていませんので、ご使用に当たっては十分ご注 意願います。このソフトウエアを使用したことによるすべての損 害について、作者は一切その責任を負わないものとします。7.その他
このプログラムは、著作権を放棄していない「フリーソフトウ エア」です。注意事項を十分ご確認の上、自由に使用していただ いてかまいません。7-1 連絡先
このプログラムに対する、ご意見、ご要望、ご質問、ご感想、 バグ情報などございましたら下記の宛先までメールをお願い致し ます。尚、頂いた、ご意見、ご要望、ご質問は、ホームページ上 で、公開することもありますので、予めご了承ください。 AKIYA e-mail:aki_chi@live.jp7-2 履歴
rel.0.07a 2000/2/27 ・ヘッダ kernel.h の定義(FP)を変更。 ・添付 lcddrv.obj の文字コードH'A0~H'FFの文字化けを修正。 ・添付 ioregs.h のD/A関連レジスタ定義を修正。 ・添付 main.c のヘッダ変更によるワーニングを修正。 rel.0.07 1999/7/31 ・システムコールの ret_int をマクロから関数に変更。 ・システムコールの ret_wup をサポート。 ・タスク独立部から呼び出し可能なシステムコールについて 呼び出せるように修正。(割り込みルーチン向け) rel.0.06c 1999/5/23 ・システムコールの dis_dsp でディスパッチを禁止したにも かかわらず、ディスパッチが実行されてしまうのを修正。 rel.0.06b 1999/3/13 ・システムコールの wup_tsk の不具合を修正。 rel.0.06a 1999/2/11 ・システムコールの can_wup の不具合を修正。 rel.0.06 1999/2/6 ・システムコールの can_wup をサポート。 rel.0.05 1998/11/22 ・システムコールの def_exc, ter_tsk をサポート。 rel.0.04 1998/11/3 ・タスクの削除でスタックを開放するように変更。 ・exd_tsk でタスクが削除されないのを修正。 rel.0.03 1998/10/11 ・ディスパッチロジックを修正。 ・システムコールの ext_tsk, exd_tsk をサポート。 ・ディスパッチ禁止状態で get_tid を実行すると FALSE を返すのを修正。 rel.0.02 1998/9/27 ・スタック、クロック値を外部変数としてカーネルに指示する構造に変更。 ・使用するタイマーを選択できるように変更。 ・システムコールの rot_rdq をサポート。 ・タスク起動時に正常終了コードが E_OBJ になっていたのを E_OK に修正。 rel.0.01 1998/9/15 公開