目次

はじめに


本ホームページに書かれている内容の使用は自由ですが、
これらを用いて直接、間接を問わずに、金銭利益を得る
行為(内容販売、有料情報提供等)はしないでください。
著作権も、放棄していません。

また、これらは、自己責任で利用してください。
本ホームページで公開している内容を元にして、不利益、
不具合、傷害等が発生しても、筆者は一切責任を負いません。
予めご承知ください。


USOとは

 USO(Unvoiced Shadow Operating system)は、「ユーソ」と読んでください。  間違っても、「ウソ」とは言わないでください。  USOは、RTOS(Real Time Operating System)ですが、多機能ではありません。  自分が、計測やロボットを動かすためのファームウエアを設計、開発する時間  を短縮しようと考え作った、小さなRTOSです。  次の特徴があります。
  1. ノンプリエンプティブなRTOSです。
  2. タスクのスケジューリングとディスパッチができます。
  3. タスクはラウンドロビン方式で、ディスパッチします。
  4. 10msの整数倍(最大65535倍)の時間待ちができます。
  5. システムコールは、μITRONに準拠しています。
  6. メモリの少ないマイコンで動けるように作ってあります。

開発動機

 社会に出てから、特殊用途、試作、実験機器を設計、開発する仕事を続けて  きました。  安価かつ短納期を要求されることが多かったので、使うマイコンやハードも  要求仕様にあわせて、定番あるいは超低価格品を利用してきました。  分野により、使うマイコンを選ばなければならず、アセンブリ言語で開発して  いたのでは、効率が悪く、何とかC言語だけでRTOSを実現したいと考えていま  した。  諸般の事情から、勤務先を退職し、病院のベッドに臥している日々の中で、  「いい機会だから、RTOSを設計しよう。」と考えました。

RTOSの動作

 病室のベッドから見える天井を、ホワイトボードに見立てて、  タスクの動きを2週間ほど考えました。  病院の日常は、時間が決められているルーチンワークと同じです。  医師の動きを見ているうちにRTOSの動作が頭の中に閃きました。  タスクを、医師と見れば、時刻と呼ぶイベントをトリガーとして  患者と何らかのやりとりをしています。急患であれば、対応します。  RTOSは、あるイベントが発生したならば、誰かが規定した時間以内に対応  することが仕事です。イベントには、色々あるでしょうが、イベントごと  にタスクを割り当てて、仕事をさせれば、それでRTOSになります。  医師は、担当分野があります。外科、内科、皮膚科、眼科、精神科etc。  医師がタスクならば、担当の患者さんの回診をイベントとみなせます。  急患は、マイコンの分野で置き換えてみると、割込みとなるでしょう。  緊急に対応が必要になります。  現実の医師は、複数の患者さんを診ることになりますが、タスクはひとつ  のことだけに集中していけば、充分です。  病院という建物の中で、3人のA医師、B医師、C医師が、担当のaさん  bさん、cさんを毎日回診すると仮定します。  タスクである3人の医師と患者さんの関係は、次のようになります。
  1. A医師 → 患者aさんを回診
  2. B医師 → 患者bさんを回診
  3. 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を実現できます。
目次

inserted by FC2 system