AVRでOS(その2)

OSの仕様を策定。


名前は AVRIL-TAN命名。「アヴリルたん」と読みます。
AVR built-In Lightweight TAsk Navigator の略です。もちろんこじつけですが、このOSのコンセプトである、(1)AVRマイコン用のOS (2) 小容量の内蔵ROMに収まる軽量なOS (3)タスクの制御に機能をしぼったOS ということを表しています。


処理能力もメモリも乏しいAVRで使うので、思い切り割り切った仕様にします。まず、CPUの解放はタスクに委ねるノンプリエンプティブ方式とすること。タスクに優先度は設けず、ラウンドロビンで順次切り替えること。タスク間の同期機構は単純なイベントフラグのみとすること。タイマを用いたスリープはOSが提供すること。タスクやイベントのリソースは予め見積もって静的に確保しておくこと。システムコールはエラーチェックをしないこと(不正なシステムコール実行時の挙動は無保証)。


システムコールは以下の9個だけ。


// タスクの生成 (タスクID、開始アドレス(関数ポインタ)、スタックサイズ を指定)
void CreateTask(UINT8 id, void* start_addr, UINT16 stack_size);

// 指定IDのタスクの開始(実行待ち状態へ)
void StartTask(UINT8 id);

// 自タスクの停止(休止状態へ)
void ExitTask(void);

// 自タスクを指定時間だけスリープ(待ち状態へ)
void SleepTask(UINT16 time);

// 次のタスクへ処理を移す(自タスクは実行待ち状態へ)
void RotateTask(void);

// 自タスクを指定IDのイベントフラグ待ちにする(待ち状態へ)
void WaitFlag(UINT8 id);

// 指定IDのイベントフラグのポーリング
BOOL PollFlag(UINT8 id);

// 指定IDのイベントフラグのセット
void SetFlag(UINT8 id);

// 指定IDのイベントフラグのクリア
void ClearFlag(UINT8 id);

これなら1kBくらいでおさまるんじゃないかな。
システムコールの名前はITRONに似せましたが、ああいう略記は好きじゃないので今風にしてます。