自律小型知能ロボットMIRS用リアルタイムモニタ
「MIRX68K」説明書 |
作成日:
1998, 4,15 第2版 タイマータスク関係の仕様変更に伴う改訂(澤研究室)
1998,11,26 第3版 「2(4)3)タイマータスク」の説明文一部改訂(澤研究室)
MIRX68KはMIRS専用のリアルタイムモニタであり、タイマや外部からの割り込み要求信号(例外処理)などで起動される複数のタスクを管理する。ユーザに対してMIRSのソフトウエア作成に標準的な手法を与えるため、ソフトウエア構造の見通しが良くなり、開発効率を上げることができる。
Fig.1-a MIRX68Kの構成
Fig.1-b MIRX68Kの構造
(1)タスクの概念
プログラムはいくつかの処理単位に分割できる。例えば、MIRSの制御ソフトウェアならば、機能別にセンサ管理、フィードバック演算、DCモータ駆動部、行動判断部のように分割したり、動作モード別に分割してもよい。必要に応じて更に細かく分割することもできる。このようにして分割した仕事の固まりをタスクといい、それぞれのタスクで行われる処理には、プログラム中での事象により行われる処理(ノーマル処理)、一定の時間周期で行われる処理(タイマ処理)、非同期で発生する外部信号による割込み要求によって行われる処理(割込み処理)がある。
(2)タスクの分割
リアルタイムモニタはプログラムをタスク単位に分割して、それぞれのタスクを管理している。複数のタスクに分割する目安として以下のとおりである。
1.作業の内容や動作が違う処理
2.並列に実行する処理
3.時間の前後関係や因果関係で変化する処理
4.連続していても、処理速度に差がある処理
5.分割した方が修正、変更、保守が容易になる処理
(プログラミングすると大きなプログラムとなる処理など)
(3)タスクの状態
CPUが一つしかない場合に、プログラム実行中に全てのタスクを同時に動作させることはできない。それぞれのタスクは以下の4つの状態で管理され、システムの実行に伴って各遷移条件に従って状態が変化する。
Fig.2 タスクの状態遷移図
1.レディ(Ready):実行できるが他のタスクがCPUを占有しているため、CPUが空くのを待っている状態。
2.ウェイト(Wait):実行されたタスクが何らかの事象を待つ状態。ある条件が成立するまで待ち、成立するとレディ状態になる。
3.ドーマント(Dormant):タスクとしてモニタに認知されているが、休止している状態。他のタスクによって起動されて、レディ状態になる。
4.ランニング(Running):タスクが実行されている状態。
本モニタではウェイト状態の管理を行っていないが、ノーマルタスク(後述)が実行され終了した後、割り込みを待ち、割り込みタスク(後述)によって再起動させることにより、ウェイトの状態を作り出すことはできる。しかし、ウェイト中にノーマルタスクの起動を抑止する制御を、モニタが行っていないのでその必要がある場合は、各ユーザーがノーマルタスクの中で管理する必要がある。
(4)タスク・ファイルの構成
タスクは、ユーザが規定に従い作成する制御プログラムモジュールであり、あらかじめ定められたタスク名でモニタに登録する必要がある。
1つのタスクは下の4種類のタスクに分類される。C言語ではそれぞれのタスクは関数として扱われるため、4つの関数を1つのグループとしてタスク・ファイルと呼ぶ。それぞれの関数は次のとおりである(×× は2桁のタスク・ファイル番号)。
1)イニシャライズ・タスク inzt××( )
プログラム開始時に、モニタは全てのタスクのこのイニシャライズタスクを一度だけ起動する。 ここではタスクの初期設定(タイマ処理、割り込み処理の設定など)や登録、初期値の設定、また 初めに実行するタスクの登録などを行う。
2)ノーマルタスク nrmt××(int,int)
タイマ処理でも割り込み処理でもない、一般的な処理を行う関数である。プログラムの中での事 象によって起動する処理はここに書く。自分または他のタスクがシステムコール1を使用すること によってレディ状態になる。また、実行される際の優先度(*注)を持っている。
3)タイマータスク timt××(int,int)
ユーザが指定する時間周期で実行される。システムコール2でセットされ、システムコール4でリセットされ、システムコール3で再起動される。
4)割り込みタスク intt××( )
指定したポートから、割り込み要求信号があるときに実行される割り込み処理関数である。信号があると実行中の他のタスクを中断して実行される。従って多重割り込みになる恐れがあるため、実行中は他からの信号による割り込みはマスクする(割り込みレベル4以下のみ)ようになっている。システムコール5で割り込みテーブルに登録される。マスク、アンマスクはシステムコール10、11で行われる。
Fig.3 タスク・ファイルの構成
*注:優先度処理について
レディ状態のノーマルタスクが複数個存在するとき、どれに実行権を渡すかを決定するために、優先度というものが導入されている。即ち、各ノーマルタスクには0から6のいずれかの優先度が与えられ、同時にレディ状態になったノーマルタスクがある場合には、優先度の高い(0が最高)ものから順に実行される。即時性が高く要求されるノーマルタスクの優先度は高く、多少の時間の遅れが許容できるノーマルタスクの優先度は低く設定する。優先度は登録時に設定する。
同一優先度にタスクが複数登録された場合は登録順に処理される。
Fig.4 優先処理例
(5)タスクの大きさについて
リアルタイム処理では、1つのタスクがCPUを占有する時間が長いと、他のタスクの実行やタイマタスクの実行の遅延につながる。従って、1つのタスクの大きさ(処理時間)を制限しなければならない。目安として、1タスクあたりの実行時間が、数msec以内とすることが望ましい。実行時間に問題があるような大きなタスクは、更に分割するなどの工夫が必要である。
MIRX68Kには、データの保全等のためにユーザに対してシステム・コール関数が用意されている。
(1)タスク初期設定 SYS0
機能:イニシャライズタスクで行うタスク初期設定。
void sys0(int tskn,int flag) //システムコール0
引数 tskn :タスクナンバ
flag :フラグ(16進4桁)
flag は 0xX1X2X3X4 で表される。
X4 : 割り込みタスクの有無(1:有、2:無)
X3 : タイマタスクの有無
X2 : ノーマルタスクの有無
X1 : タスクの有無
(2)ノーマルタスク登録 SYS1
機能:この命令によってノーマルタスクはレディ状態になる。
int sys1(int tn,int py,int cm,int scm) //システムコール1
引数 tn :タスクナンバ
py :優先度(0から6まで)
cm :ノーマルコマンド
scm :ノーマルサブコマンド
(3)タイマタスク登録 SYS2
機能:この命令によってタイマタスクは時間待ち状態になる。
void sys2(int tn,int st,int cm,int scm) //システムコール2
引数 tn :タスクナンバ
st :タイマセット値(タイマ起動の周期 =st×タイマ割り込み間隔(*注))。
cm :タイマコマンド
scm :タイマサブコマンド
*注:この値は、ユーザーが68Kのタイマカウンタ(タイマ割り込み周期)を設定する値である。
(4)カウントスタート SYS3
機能:タイマストップ命令によって停止されたタイマ起動を再スタートする命令。
reset が0なら停止したときのカウント値から、0以外ならカウント値をリセットしてスタートする。
void sys3(int tskn,int reset) //システムコール3
引数 tskn :タスクナンバ
reset :リセットフラグ
タスクのカウンタ起動のフラグを立てて、カウント可能にする。リセットフラグが0以外だと、タイマカウント値を0にする。
(5)カウントストップ SYS4
機能:タイマタスクのタイマ起動をストップさせる。カウント値は保持する。
void sys4(int tskn) //システムコール4
引数 tskn :タスクナンバ
(6)割り込みタスク登録 SYS5
機能:割り込みタスクを登録する。この命令によって割り込みタスクは割り込み信号待ち状態になる。
void sys5(int tskn,int aflg,int lev,int cm,int scm) //システムコール5
引数 tskn :タスクナンバ
lev :割り込みレベル(1から6まで。ただしレベル6はタイマー割り込みで使用されている)
aflg : オートベクタ割込み(=1)か非オートベクタ割込み(=0)
cm :割り込みコマンド
scm :割り込みサブコマンド
(7)Bulletin Board(BB)書き込み SYS8
機能:指定されたBBにデータを書き込む命令。(*注1)
void sys8(int tskn,int bbn,int dat) // システムコール8
引数 tskn :タスクナンバ
bbn :BBナンバ(0からBB_MAXまで)。BB_MAXはデフォルトで6。
dat :書き込みデータ(整数型)
(8)Bulletin Board(BB)読み出し SYS9
機能:指定されたBBよりデータを読み出す命令。この命令では戻り値としてデータを返す。(*注1)
int sys9(int tskn,int bbn) // システムコール9
引数 tskn :タスクナンバ
bbn :BB番号
(9)SYS10:割り込みのマスク
機能:指定された番号の割り込みをマスクする命令。
void sys10(int irqn) //システムコール10
引数 irqn :割込み要求番号IRQ(*注2)
(10)割り込みマスク解除 SYS11
機能:指定された番号の割り込みをアンマスクする命令。
void sys11(int irqn) //システムコール11
引数 irqn :割込み要求番号IRQ(*注2)
*注1:Bulletin Board(BB)について
BBはデータ掲示板のようなもので、それぞれのタスク番号についてBB0からBB_MAX(デフォルトで6)まで用意されている。どのタスクからでも書き込み、参照ができるようになっている。ここにデータを書き込んでタスク間のデータのやりとりを行えば(タスク間通信)、データの保全が図れる。プログラム・モジュールの独立性を保つために出来るだけグローバル変数を使わず、BBを使う。
Fig.5 Bulletin Board
*注2:割込み要求番号IRQ
VMEバスを使用したMIRSの標準的なボード構成では、超音波センサー及び赤外線センサーによる割込みはIRQ=1、タッチセンサーはIRQ=4に設定されている。
(1)タスクの作成
a)項目2「タスクの作成」を参考してタスクを作成する。その際、タスクのファイル名は
task00.c
task01.c
・・・
task10.c
・・・
とし、番号を連続させること。すべてのタスクファイルはMIRX68Kのソースファイルmirx68kc.c(Ver.3.2 July 28,1998)が置かれているディレクトリ内に置かねばならない。
b)ヘッダファイルmirx68k.hのインクルード MIRX68Kで定義したシステム・コール関数のプロトタイプ宣言をするためにタスク・ファイルの先頭部でmirx68k.hをインクルードすること。
c)ハードウエア関数の使用 MIRSのハードウエアを操作する場合には、ハードウエア関数hard.c(Ver.2.2)で定義された関数を使用すること。そのために、これを使用するタスク・ファイルの先頭部でヘッダー・ファイルhard.h(Ver.2.2)をインクルードすること。
d)ユーザーが作成して使用するグローバル定数・変数の宣言 グローバル変数の使用は避け、BBを用いてデータの受け渡しを行った方がよい。
e)RS-232Cポートの使用 受信割込みにレベル5(非オートベクタ)割込みを使用しているので、他の割込み要因との優先関係を把握して利用すること。MIRX68Kではタイマ割込みにリアルタイム・クロックを使用したレベル6(オートベクタ)割込みを使用している。
(2)「table.h」(タスク初期設定用ヘッダ・ファイル)の作成法
タスクの宣言や管理テーブルを組み込むためにこのヘッダファイルtable.hをMIRX68Kにインクルードする必要がある。MIRX68Kのソースファイルmirx68kc.cが置かれているディレクトリ内に置かねばならない。
1)#define MAXTSK //タスク・ファイル数の宣言
定数 MAXTSK は「MIRX68K」とコンパイルするタスク・ファイル(task00.cからtaskxx.cまで)の数である。ここで定義した数だけタスクを作成しなければならない(しかし、ファイル内のイニシャライズタスクを除く3種のタスクの処理がなくともダミーとして定義する必要がある)。
2)#define BB_MAX //BBの個数の宣言
3)タスク関数のプロトタイプ宣言
extern void inztxx();
extern void nrmtxx(int,int);
extern void timtxx(int,int);
extern interrupt void inttxx();
ここでxxはタスク・ファイル番号。使用するタス・ファイルについてすべてプロトタイプ宣言をすること。
4)管理テーブルの初期値の設定
MAXTSK の数だけ、初期値を設定しておく必要がある(例を参照)。
(3)実行形式ファイル「mirx.x」の作成法
1)リンカ・コマンド・ファイル「mirx.cmd」の作成
使用するタスクファイル(オブジェクト・モジュール)をロードするために、コマンド・ファイルmirx.cmdを編集する。
2)MAKEFILE「makefile」の作成
実行形式ファイルを自動生成するためにmakefileを編集する。OBJS=にタスク・ファイルtaskxxのオブジェクト・ファイル名taskxx.oをスペースで区切って記述する。
3)実行形式ファイルの構築
MIRS用ソフトウエア開発ツールがインストールされたワークステーション上の自分のディレクトリに以下のファイルを作成した後、makeコマンドを実行すると実行形式ファイルmirx.x(名前はmakefile内のTARGET=に適当な名前を書くことにより変更できる)が自動生成されるので、MIRSのMPUボードのRAM上に展開するか、ROM化して実装することにより実行できる。