オリジナルOS「MicrOS」の設計と実装(3) ―― MicrOSのシステム・コール
4.タイマ関連の関数
● タイマ処理関数
タイマ制御のために,アプリケーション側では以下の関数を用意しなければなりません.いずれもタイマ・デバイスを制御する関数です.これらの関数の構成方法は_initTimerを除いて,可変タイマを使用できる場合とそうでない場合で異なります.
可変タイマを使用できるかどうかはハードウェアのカウント値が読み込めるかどうかによります.読み込むことができれば,インターバル・タイマをセットするとき,要求に対しできるだけ長い時間を設定して割り込み回数を少なくできます.アプリケーション・システムの省電力効果も期待できます.
1) タイマ・デバイスにタイマ値を書き込む
unsigned int _writeTimerValue(unsigned int value)
2) タイマ・デバイスからタイマ・カウント値を読み込む
unsigned int _readTimerValue(unsigned int remain)
3) タイマの動作を停止する
void _stopTimer(void)
4) タイマのカウント動作を開始させる
void _startTimer(void)
5) タイマ・デバイスの初期設定
void _initTimer(void)
_initTimer関数は,使用するタイマ・デバイスを割り込みモードで動作できるように設定します.この関数をaplMainで呼び出しておけば,ほかで使われることはありません.
まず,可変タイマで制御する場合について説明します.
_startTimer関数は,タイマ・カウントを開始させる関数です.この機能は_writeTimerValue関数に持たせなければならないので,通常は何も行いません.
_stopTimer関数は,すべてのインターバル・タイマの要求する処理が終了し,リクエストがなくなったときにコールされる関数です.タイマ・デバイスの動作を停止させ,省電力モードにします.
_writeTimerValue関数は,パラメータとして1ワードのタイマ設定値を受け取ります.これがハードウェアのタイマ・デバイスに設定可能な値かどうかを判断し,デバイスに設定可能な最大値と要求された値の小さい方をデバイスに設定して,残りの値を返り値とします.ハードウェアには実際のカウント値より1小さい値を設定しなければならない場合があるので気を付けます.
_readTimerValue関数は,インターバル・タイマの要求があるときに新たなタイマ要求を受け付けた場合,処理中の要求がどの程度消化されているのかを計算するためにコールされます.パラメータにはタイマを設定したときの残り値(_writeTimerValueの返り値)が与えられます.これにハードウェアのカウント値から計算される経過時間を加えて返り値とします.
次にインターバルを固定にする場合について説明します.この場合,カウントの単位は1になります.
_startTimer関数は,1カウントの時間をデバイスに設定してカウントを開始します.
_stopTimer関数は,タイマ・デバイスの動作を停止させて省電力モードにします.
_writeTimerValue関数は,入力されたタイマ値から1を引いて返り値とします.タイマ・デバイスに対する書き込みは不要です.
_readTimerValue関数は,入力されたタイマ値に1を加えて返し値とします.この処理には疑義があります.入力値そのままを返り値とすることも可能です(処理上の安全のため,前者を採用している).
● セット・タイマ
int __setTimer(_TMRRQB *rqb, unsigned int Timer, void (*tmover)(void *param), void *param)
TCBでないRQBを指定してインターバル・タイマを設定します.タイマのカウント・アップ時にはtmovr関数がコールされます.この関数(このようにあらかじめ処理を想定して登録しておく関数を,MicrOSではデマンド・コールバック関数と呼ぶ)には一つのパラメータを設定できますが,通常はここに第1パラメータで指定したrqbを与えます.これによりデマンド・コールバック関数で次々と時間を変更してタイマを継続できます.この関数で用いるrqbは,__rqbinit関数で初期設定しておく必要があります.
● インターバル・タイマのキャンセル
int __canTimer(_TMRRQB *rqb)
__setTimer関数で登録したインターバル・タイマをキャンセルします.
tag: OS