目次
次
はじめに
本ホームページに書かれている内容の使用は自由ですが、
これらを用いて直接、間接を問わずに、金銭利益を得る
行為(内容販売、有料情報提供等)はしないでください。
著作権も、放棄していません。
また、これらは、自己責任で利用してください。
本ホームページで公開している内容を元にして、不利益、
不具合、傷害等が発生しても、筆者は一切責任を負いません。
予めご承知ください。
USOとは
USO(Unvoiced Shadow Operating system)は、「ユーソ」と読んでください。
間違っても、「ウソ」とは言わないでください。
USOは、RTOS(Real Time Operating System)ですが、多機能ではありません。
自分が、計測やロボットを動かすためのファームウエアを設計、開発する時間
を短縮しようと考え作った、小さなRTOSです。
次の特徴があります。
- ノンプリエンプティブなRTOSです。
- タスクのスケジューリングとディスパッチができます。
- タスクはラウンドロビン方式で、ディスパッチします。
- 10msの整数倍(最大65535倍)の時間待ちができます。
- システムコールは、μITRONに準拠しています。
- メモリの少ないマイコンで動けるように作ってあります。
開発動機
社会に出てから、特殊用途、試作、実験機器を設計、開発する仕事を続けて
きました。
安価かつ短納期を要求されることが多かったので、使うマイコンやハードも
要求仕様にあわせて、定番あるいは超低価格品を利用してきました。
分野により、使うマイコンを選ばなければならず、アセンブリ言語で開発して
いたのでは、効率が悪く、何とかC言語だけでRTOSを実現したいと考えていま
した。
諸般の事情から、勤務先を退職し、病院のベッドに臥している日々の中で、
「いい機会だから、RTOSを設計しよう。」と考えました。
RTOSの動作
病室のベッドから見える天井を、ホワイトボードに見立てて、
タスクの動きを2週間ほど考えました。
病院の日常は、時間が決められているルーチンワークと同じです。
医師の動きを見ているうちにRTOSの動作が頭の中に閃きました。
タスクを、医師と見れば、時刻と呼ぶイベントをトリガーとして
患者と何らかのやりとりをしています。急患であれば、対応します。
RTOSは、あるイベントが発生したならば、誰かが規定した時間以内に対応
することが仕事です。イベントには、色々あるでしょうが、イベントごと
にタスクを割り当てて、仕事をさせれば、それでRTOSになります。
医師は、担当分野があります。外科、内科、皮膚科、眼科、精神科etc。
医師がタスクならば、担当の患者さんの回診をイベントとみなせます。
急患は、マイコンの分野で置き換えてみると、割込みとなるでしょう。
緊急に対応が必要になります。
現実の医師は、複数の患者さんを診ることになりますが、タスクはひとつ
のことだけに集中していけば、充分です。
病院という建物の中で、3人のA医師、B医師、C医師が、担当のaさん
bさん、cさんを毎日回診すると仮定します。
タスクである3人の医師と患者さんの関係は、次のようになります。
- A医師 → 患者aさんを回診
- B医師 → 患者bさんを回診
- C医師 → 患者cさんを回診
RTOSの実現方法
病院により、医師と患者さんの数は、千差万別なので、どう
患者さんを回診するかを考えます。
Cで、3人の医師と3人の患者さんの回診処理は、
次のように記述できます。
while (1) {
tsk0_proc(); /* 患者aさんを回診 */
tsk1_proc(); /* 患者bさんを回診 */
tsk2_proc(); /* 患者cさんを回診 */
}
曜日により、患者さん検査で回診が不要なこともあります。
病室に患者さんがいるかを判断する処理を加えます。
run_tsk = 0 ;
while (1) {
if ( exist_patient( run_tsk ) == YES ) {
switch ( run_tsk ) {
case 0 : tsk0_proc(); break ;
case 1 : tsk1_proc(); break ;
case 2 : tsk2_proc(); break ;
}
}
run_tsk++ ;
if ( run_tsk == 3 ) {
run_tsk = 0 ;
}
}
医師が増減すると、switchで判断する内容を増減しますが
面倒なので、テーブルを利用して、医師の仕事を割り当て
ます。
run_tsk = TSK_ID0 ;
while (1) {
if ( exist_patient( run_tsk ) == YES ) {
(*(pcur_tsk.tsk))();
}
run_tsk++ ;
if ( run_tsk == TSK_ID_MAX ) {
run_tsk = TSK_ID0 ;
}
}
上のように記述すれば、RTOSを実現できます。
目次
次