読者です 読者をやめる 読者になる 読者になる

不確定特異点

広く深く、ところどころ超深く

軽量 RTOS の開発 (7)

OS ARM C

今日はアラーム機能を実装しました。

github.com

アラーム機能とは、ある一定時間が経ったときに、タスクを起こしたり(アクティベーション)、イベントフラグを立てたり、コールバック関数を呼ぶという機能です。そもそも OS は時間をどう計るか?という話ですが、それにはタイマー割り込みを使います。どんな SoC にも普通はタイマーというハードウェアがあり、それが一定時間毎(例えば 10 ms 毎とか)に CPU に対して割り込みを発生させる事ができるのですが、OS はその割り込み回数を数えて、どのくらい時間が経過しているかを知る事ができます。

OSEK/VDX の場合、次のような図式になっているようです。(ちょっと OSEK/VDX の仕様書はこの辺、あっさりとしか書かれてないので、解釈に齟齬があるかも。)

タイマー ⇒ カウンタオブジェクト ⇒ アラームオブジェクト

カウンタオブジェクトはタイマーを subscribe し、タイマー割り込みを計測します(tick 数)。タイマーの tick 数がある量(ticksperbase)だけ溜まったら、カウンタを 1 進めます。続いて、アラームオブジェクトですが、今度はこのカウンタオブジェクトを subscribe します。カウンタの値がある量だけ溜まったら、タスクをアクティベートする等の、アラーム動作を発火させます。OS の時間管理機能としてはアラームだけなので、タイマーによる強制タスク切り替えは OS の基本機能としてはないんですね。そのため、タスク切り替えの契機は、タスクを開始/終了させたとき、イベントフラグがセットされたとき、リソースを解放/確保したとき、しかないようです。

OSEK/VDX ってもともと作りたかったミニマルな RTOS という意味ではすごく満たしていて、その仕様を参考にしていたら、そのまんま OSEK/VDX の OSS 実装になってきちゃいました。最初は組み込みでマイクロカーネル、とかいうロマンがあったんだけどな…。