組み込み型リアルタイム・マイクロ・カーネル
【概要】
このカーネルは、μ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.jp
7-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 公開