azki102

所属分类:处理器开发
开发工具:Unix_Linux
文件大小:96KB
下载次数:38
上传日期:2006-09-06 11:32:59
上 传 者yokkie
说明:  this is RealTimeOS(uITRON) for hitachi H8 processor.
(this is RealTimeOS (specification) for hitachi H8 processor.)

文件列表:
azki102\Azki102\azconf.h (1478, 1999-05-07)
azki102\Azki102\azlib.app (87040, 2001-07-18)
azki102\Azki102\AzLib.apv (84, 1998-08-21)
azki102\Azki102\azlib.pat (18470, 1999-08-24)
azki102\Azki102\azlib.txt (3051, 1999-08-24)
azki102\Azki102\azpatch.bat (580, 1999-08-24)
azki102\Azki102\azpriv.h (2374, 1999-05-07)
azki102\Azki102\azrtos.app (10240, 2001-07-18)
azki102\Azki102\azrtos.apv (72, 1998-08-21)
azki102\Azki102\azrtos.c (39378, 2001-07-18)
azki102\Azki102\azrtos.h (9724, 1999-07-06)
azki102\Azki102\azrtos.mak (589, 1999-06-08)
azki102\Azki102\main.c (7493, 2001-07-18)
azki102\Azki102\ncrt0.a30 (6577, 1999-07-08)
azki102\Azki102\patch.exe (81920, 1995-01-30)
azki102\Azki102\sect30.inc (6732, 2001-07-16)
azki102\Azki102\syscalls.txt (18030, 2000-08-04)
azki102\Azki102\testdata.iod (1088, 1999-05-10)

┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃ ┃ ┃ 小豆のように小さいリアルタイムOS AzkiRTOS ┃ ┃ ------------------------------------------- ┃ ┃ azreadme.txt - AzkiRTOS Document ┃ ┃ Copyright (C) 1999-2001, アンカーシステムズ株式会社 ┃ ┃ All rights reserved. ┃ ┃ ┃ ┃ ◆ ◆ ◆ ┃ ┃ ┃ ┃ このファイルは、AzkiRTOSの一部分です。 ┃ ┃ このファイルのの著作権はアンカーシステムズ株式会社に属しますが、 ┃ ┃ 誰でもファイルを無変更、または変更して***に使うことができます。 ┃ ┃ また無償で再配布することも可能ですが、オリジナルの著作権表示を ┃ ┃ そのままの形で含めてください。 ┃ ┃ ┃ ┃ ただし、無変更または変更したものを製品の一部としてではなく、 ┃ ┃ リアルタイムOSそのものとして無断で再販売することはできません。 ┃ ┃ ┃ ┃ アンカーシステムズ(株)は、無変更または変更したAzkiRTOSを組み込んだ ┃ ┃ 製品の不具合に対して一切責任を負うものではありません。AzkiRTOSを ┃ ┃ 含めAzkiRTOSを組み込んだ製品全体の動作保証は、AzkiRTOSを組み込んだ ┃ ┃ 製品の開発者の責任となります。 ┃ ┃ ┃ ┃ アンカーシステムズ株式会社 ┃ ┃ 〒674-0082 兵庫県明石市魚住町中尾337 ┃ ┃ TEL: 078-946-5554 ┃ ┃ FAX: 078-946-5575 ┃ ┃ WEB: http://www2.noritz.co.jp/anchor/ ┃ ┃ MAIL: anchor@noritz.co.jp ┃ ┃ ┃ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ このファイルでは、AzkiRTOSのデータ型、システムコールリファレンス、スタート アップルーチンの変更方法などを説明しています。ご***にお試しください。 【注意】マルチタスク対応のパッチを当てたライブラリの再構築方法は、azlib.txt を参照してください。 【注意】AzkiRTOSとサンプル main ルーチンのファイル中には、AnchorPlace標準搭載 のシミュレータでデバッグするための特殊なマクロが埋め込まれています。 実機や他の環境で動作させるには、これをoffにするか、環境に合わせて変更 しなければなりません。offにするには、azrtos.h の28行目にある#defineを コメントアウトしてください。AzkiRTOS のサイズは、このデバッグスイッチ を off にした状態でのコード量です。 【参照】M16C/62を使った簡単な拡張可能なCPUボードと、統合開発環境AnchorPlaceLite をセットにしたRTOS開発KITを用意しております。詳しくはホームぺージをご覧 ください。 ◆◆◆ データ型 ◆◆◆ ヘッダファイル azrtos.h の中で以下のデータ型をtypedefしています。ほとんどが uITRON 仕様で定義されているものと同じです。 typedef signed char B; typedef signed short H; typedef signed long W; typedef unsigned char UB; typedef unsigned short UH; typedef unsigned long UW; typedef unsigned char VB; /* データタイプが一定でない8-bitデータ */ typedef unsigned short VH; /* データタイプが一定でない16-bitデータ */ typedef unsigned long VW; /* データタイプが一定でない32-bitデータ */ typedef void __azfar * VP; /* データタイプが一定でないポインタ */ typedef void __aznear * VNP; /* データタイプが一定でないnear領域へのポインタ */ typedef void (*FP)(); /* プログラムスタートアドレス */ typedef signed int INT; /* 符号付き整数 */ typedef unsigned int UINT; /* 符号なし整数 */ typedef int BOOL; /* ブール値 */ typedef int FN; /* 機能コード */ typedef VNP ID; /* オブジェクト識別子(オブジェクトのアドレスで代用) */ typedef int BOOL_ID; /* ブール値またはID番号 */ typedef int HNO; /* ハンドラ番号 */ typedef int RNO; /* ランデブ番号 */ typedef int NODE; /* ノード番号 */ typedef unsigned ATR; /* オブジェクト属性 */ typedef int ER; /* エラーコード */ typedef int PRI; /* タスク優先順位 */ typedef int TMO; /* タイムアウト時間 */ typedef int DLYTIME; /* ディレイ時間 */ データ型に関して uITRON 仕様との相違点は以下のとおりです。 1. near領域のアドレスであることを明示するポインタ VNP を追加しました。 2. uITRON 仕様では、IDは小さな整数であるが、AzkiRTOSでは near 領域へのポインタ となります。これにより整数とタスクコントロールブロックの対応管理が不要に なり、全体がシンプルで小さく、速くなります。従ってを受け取るシステム コールには、タスクコントロールブロックやセマフォのアドレスを直接渡します。 まあ、タスクIDという意味を広義に解釈すると、タスクを識別できる識別子です から、整数であってもアドレスであっても構わないと考えることもできますが... 【例】AzTCB task1; /* AzkiRTOS のタスクコントロールブロック */ ER ercd; /* エラーコードを受け取る変数 */ ... ercd = sta_tsk(&task1, 0); ◆◆◆ システムコールリファレンス ◆◆◆ ============================================================================= vini_sys AzkiRTOS全体の初期化 ----------------------------------------------------------------------------- 【関数】void vini_sys(void) 【引数】void 【戻値】void (戻ってきません) 【解説】 AzkiRTOS 全体を初期化した後、最初のタスクを起動します。最初のタスクの入り口 関数名は、ヘッダファイル azconf.h の中の AZ_IDLEENTRY です。デフォルトでは main となっているため、まず最初のタスクとして main 関数から走り出します。 main 以外の関数を最初のタスクとして起動したい場合は、別の関数を指定してくだ さい。この関数はりターンしません。 通常は、アセンブリ言語で記述したスタートアップ処理の終了後に、この関数をサブ ルーチンコールしてください。アセンブリ言語のモジュールから呼び出す時は、関数 名の前にアンダースコア(_)が必要です。 最初のタスクのスタック領域の大きさは、同じく azconf.h の AZ_IDLESTACKSIZE で 設定します。デフォルトは***バイトと小さめです。最初のタスクでより多くのスタッ クが必要となる場合は、この数値を大きくしてください。 #define AZ_IDLEENTRY main #define AZ_IDLESTACKSIZE *** 【例】 .glb _vini_sys jsr.a _vini_sys ; ここへはリターンしません. 【参照】vini_tsk ============================================================================= vini_tsk タスクコントロールブロックの初期化 ----------------------------------------------------------------------------- 【関数】void vini_tsk(ID tskid, FP entry, PRI tskpri, VNP stack, UINT size) 【引数】ID tskid 初期化するタスクコントロールブロックへのポインタ FP entry タスクの起動アドレス PRI tskpri タスクの優先順位 VNP stack タスクのスタック領域へのポインタ UINT size スタック領域のバイト数 【戻値】void 【機能】 タスクコントロールブロック AzTCB を初期化します。AzkiRTOS にはメモリ管理機能 がないため、ダイナミックにタスクコントロールブロックを生成できません。代りに タスクコントロールブロックをC言語の構造体としてユーザのCプログラムのどこかで 定義し、それをこの関数で初期化して、AzkiRTOSが使える状態にします。タスクコン トロールブロックは、AzTCB という構造体です。 タスクの優先順位は、1AZ_NPRIORITIES の値です。小さい方が高い優先順位です。 AZ_NPRIORITIES は、azconf.h の中で定義されていて、デフォルトは4です。 もっと 細かく分けたい場合は、この値を修正してください。ただし大きくすると、それだけ メモリとディスパッチに必要なCPUサイクルが増加します。 何レベルの優先順位が必 要かをよく検討し、最小限にとどめた方が効率よくなります。 同様にスタック領域もユーザが確保します。スタック領域を確保するもっとも簡単な 方法は、C言語の配列としてとる方法です。 【例】 AzTCB task1; /* タスク1のTCB */ UB stack1[128]; /* タスク1のスタック */ ... /* タスクコントロールブロックを初期化し */ vini_tsk(&task1, task1_main, 2, stack1, sizeof(stack1)); /* タスクを起動する */ sta_tsk(&task1, 0); 【参照】vini_sem, sta_tsk ============================================================================= vini_sem セマフォの初期化 ----------------------------------------------------------------------------- 【関数】void vini_sem(ID semid, INT inival) 【引数】ID semid 初期化するセマフォへのポインタ INT inival セマフォの初期値 【戻値】void 【機能】 セマフォ AzSemaphore を初期化します。AzkiRTOS にはメモリ管理機能がないため、 ダイナミックにセマフォを生成できません。代りにセマフォをC言語の構造体として ユーザのCプログラムのどこかで定義し、それをこの関数で初期化して、AzkiRTOSが 使える状態にします。セマフォは、AzSemaphore という名前の構造体です。 【例】 AzSemaphore sem1; ... vini_sem(&sem1); er = wai_sem(&sem1); 【参照】vini_tsk ============================================================================= sta_tsk タスク起動 ----------------------------------------------------------------------------- 【関数】ER sta_tsk(ID tskid, INT stacd) 【引数】ID tskid タスクコントロールブロックへのポインタ INT stacd タスク起動コード 【戻値】エラーコード 【機能】 tskidで指定されたタスクを起動します。uITRON仕様との違いは、tskidが小さな整数 値ではなく、ユーザがC言語のグローバル変数として定義した AzTCB 構造体へのポイ ンタであることです。 このシステムコールでタスクを起動する前に、予めタスクコントロールブロックを vini_tsk()関数で初期化しておかなければなりません。 【例】 AzTCB task1; /* タスク1のTCB */ UB stack1[128]; /* タスク1のスタック */ ... /* タスクコントロールブロックを初期化し */ vini_tsk(&task1, task1_main, 2, stack1, sizeof(stack1)); /* タスクを起動する */ sta_tsk(&task1, 0); 【参照】ext_tsk, ter_tsk ============================================================================= ext_tsk 自タスク終了 ----------------------------------------------------------------------------- 【関数】void ext_tsk(void) 【引数】void 【戻値】void (戻ってきません) 【機能】 自タスクを終了し、DOMANT状態へ移ります。タスクが終了してしまうため、この関数 からは戻ってきません。 タスクを終了すると、使用していたタスクコントロールブロックを他のタスクの起動 に使うこともできますし、そのまま再度同じタスクを起動することも可能です。 【例】 ext_tsk(); 【参照】sta_tsk, ter_tsk ============================================================================= ter_tsk 他タスクの強制終了 ----------------------------------------------------------------------------- 【関数】ER ter_tsk(ID tskid) 【引数】ID tskid 終了させたいタスクのタスクコントロールブロックへの ポインタ 【戻値】エラーコード 【機能】 tskidで指定したタスクを強制的に終了させます。uITRON仕様との相違点は、ID が タスクを識別するための整数ではなく、タスクコントロールブロック構造体への ポインタである点です。 【例】 AzTCB your_task; /* your_task を強制終了させます */ er = ter_tsk(&your_task); 【参照】sta_tsk, ext_tsk ============================================================================= dis_dsp ディスパッチ禁止 ----------------------------------------------------------------------------- 【関数】ER dis_dsp(void) 【引数】void 【戻値】エラーコード 【機能】 タスクのディスパッチを禁止します。 以後ena_dspを実行するまでの間ディスパッチ 禁止状態となり、優先順位のより高いタスクが実行可能状態になっても、ディスパッ チされません。しかし割り込みは禁止していないので、割り込みは受け付けます。 また、待ち状態に入る可能性のあるシステムコールも使えなくなります。 【例】 dis_dps() ... ena_dsp() 【参照】ena_dsp ============================================================================= ena_dsp ディスパッチ許可 ----------------------------------------------------------------------------- 【関数】ER ena_dsp(void) 【引数】void 【戻値】エラーコード 【機能】 dis_dspシステムコールによって禁止されているディスパッチを許可します。 【例】 dis_dps() ... ena_dsp() 【参照】dis_dsp ============================================================================= chg_pri / ichg_pri タスク優先度変更 ----------------------------------------------------------------------------- 【関数】ER chg_pri(ID tskid, PRI tskpri) タスク用 ER ichg_pri(ID tskid, PRI tskpri) 割り込みハンドラ用 【引数】ID tskid 優先度を変更するタスクのタスクコントロールブロックへ のポインタ PRI tskpri 優先度 【戻値】エラーコード 【機能】 tskid で指定したタスクの優先度を tskpri に変更します。tskid に TSK_SELF を 指定すると、自タスクの優先度を変更できます。ただし ichg_pri では自タスクは 指定できません。 指定できる優先度は、1 (最優先)から azconf.h 中で定義してある AZ_NPRIORITIES までです。優先度に TPRI_INI を指定すると、タスク起動時の優先度に戻すことが できます。 タスクがREADYキューにあるときは、待ち行列の最後へ移動します。これはタスクの 優先度を変えない場合でも同じです。従ってchg_priシステムコールにより、実行権 を次のタスクへ渡すことが可能です。 【例】 /* 自タスクを最優先にする */ er = chg_pri(TSK_SELF, 1) ... /* 自タスクをタスク起動時の優先度に戻す */ er = chg_pri(TSK_SELF, TPRI_INI); 【参照】rot_rdq, sta_tsk, vini_tsk ============================================================================= rot_rdq / irot_rdq タスクのレディキュー回転 ----------------------------------------------------------------------------- 【関数】ER rot_rdq(PRI tskpri) タスク用 ER irot_rdq(PRI tskpri) 割り込みハンドラ用 【引数】PRI tskpri レディキューを回転させたい優先度 【戻値】エラーコード 【機能】 tskpri で指定した優先度のレディキューを回転させます。レディキューの先頭に あったタスクが最後尾に移動し、次のタスクが先頭になります。このシステム コールを一定時間間隔で発行することにより、ラウンドロビンスケジューリングを 行うことができます。ただし、タイマハンドラ上からこのシステムコールを呼ぶ時は、 irot_rdq を使ってください。 優先度として TPRI_RUN を指定すると、現在実行中タスクの優先度のレディーキュー を回転します。 【例】 irot_rdq(TPRI_RUN) 【参照】chg_pri ============================================================================= rel_wai / irel_wai 他タスクの待ち状態解除 ----------------------------------------------------------------------------- 【関数】ER rel_wai(ID tskid) タスク用 ER irel_wai(ID tskid) 割り込みハンドラ用 【引数】ID tskid 待ち状態を解除したいタスクのタスクコントロール ブロックへのポインタ 【戻値】エラーコード 【機能】 tskid で指定されたタスクが待ち状態であるとき、それを強制的に解除し、READY 状態へ移行させます。rel_wai により待ち状態が強制的に解除されたタスクは、 待ちの原因となったシステムコールの戻り値が E_RLWAI となるので、待ちが他の タスクによって強制解除されたことを知ることが可能です。 【例】 AzTCB other_task; ... er = rel_wai(&other_task); 【参照】slp_tsk, wai_sem ============================================================================= get_tid 自タスクのタスクID参照 ----------------------------------------------------------------------------- 【関数】ER get_tid(ID* p_tskid) 【引数】p_tskid タスクコントロールブロックへのポインタのポインタ 【戻値】エラーコード 【機能】 自タスクのタスクID(AzkiRTOSの場合は、タスクコントロールブロックへのポインタ) を取得します。 【例】 ID* pid; er = get_tid(pid); 【参照】sta_tsk, vini_tsk, ref_tsk ============================================================================= ref_tsk タスク状態の参照 ----------------------------------------------------------------------------- 【関数】ER ref_tsk(T_RTSK* pk_rtsk, ID tskid) 【引数】T_RTSK* pk_rtsk タスクの状態を返すパケットのアドレス ID tskid 状態を調べたいタスクのタスクコントロールブロックの アドレス 【戻値】エラーコード 【機能】 tskid で指定されたタスクの状態を調べ、pk_rtsk で示されたアドレスへ取得します。 現在取得できる情報は以下の3つです。更に必要な場合は、追加してください。 struct t_rtsk { PRI tskpri; /* 現在の優先順位 */ UINT tskstat; /* タスクの状態 */ UINT tskwait; /* 待ち要因 */ }; 【例】 T_RTSK rtsk; er = ref_tsk(&rtsk); 【参照】get_tid ============================================================================= slp_tsk / tslp_tsk 自タスクを起床待ち状態へ移行 ----------------------------------------------------------------------------- 【関数】ER slp_tsk(void) ER tslp_tsk(TMO tmout) 【引数】TMO tmout 起床待ちのタイムアウトまでの時間 【戻値】エラーコード 【機能】 自タスクをRUN状態から起床待ちの状態へ移します。さらにtslp_tskでは、待ち状態 のタイムアウトを指定でます。タイムアウトで目覚めたときは、システムコールの 戻り値が R_TMOUT となります。 実際 slp_tsk は、tslp_tsk(TMO_FEVR) とタイムアウト無制限としてインクルード ファイル中でマクロ定義してあるだけなので、厳密には slp_tsk という名前の システムコールはありません。 タイムアウトの単位は、タイマー割り込みの周期です。例えばタイマー割り込みが 10msec毎に設定しているとき、タイムアウトを1秒に設定するには、100 と指定し ます。 【例】 er = tslp_tsk(1000) 【参照】wup_tsk, can_wup ============================================================================= wup_tsk / iwup_tsk 他タスクの起床 ----------------------------------------------------------------------------- 【関数】ER wup_tsk(ID tskid) タスク用 ER iwup_tsk(ID tskid) 割り込みハンドラ用 【引数】ID tskid 起床させたいタスクのタスクコントロールブロックへの ポインタ 【戻値】エラーコード 【機能】 tskid で指定するタスクを起床させます。そのタスクが起床待ちの状態ではなかった 場合、wup_tsk 要求はキューイングされ、次の slp_tsk で使われます。 割り込みハンドラ上からタスクを起床させるには、iwup_tsk を使ってください。 【例】 AzTCB task1; ... er = wup_tsk(&task1); 【参照】slp_tsk, can_wup ============================================================================= can_wup タスク起床要求のキャンセル ----------------------------------------------------------------------------- 【関数】ER can_wup(INT* p_wupcnt, ID tskid) 【引数】INT* p_wupcnt キューイングされていた起床要求数を受け取るアドレス ID tskid 起床要求をキャンセルするタスクのタスクコントロール ブロックへのポインタ 【戻値】エラーコード 【機能】 tskid で指定するタスクの起床要求数をキャンセルし、その時点でキューイングされ ていた起床要求カウントを p_wupcnt が示すアドレスへ取得します。 【例】 AzTCB task1; INT wupcnt; er = can_wup(&wupcnt, &task1); 【参照】slp_tsk, wup_tsk ============================================================================= sig_sem セマフォ資源返却 ----------------------------------------------------------------------------- 【関数】ER sig_sem(ID semid) タスク用 ER isig_sem(ID semid) 割り込みハンドラ用 【引数】ID semid セマフォのID 【戻値】エラーコード 【機能】 semid で指定するセマフォに対して、資源を1つ返却します。その時点でセマフォの 資源取得を待っているタスクがあれば、そのタスクをREADY状態に移します。待って いるタスクがなければ、セマフォのカウント値をインクリメント(+1)します。 割り込みハンドラ上から資源の返却を行うときは、isig_sem を使ってください。 【例】 ApSemaphore sem1; ... er = sig_sem(&sem1); 【参照】wai_sem, ref_sem ============================================================================= wai_sem / twai_sem ... ...

近期下载者

相关文件


收藏者