【PICROSの構成】
PICROSを使った場合のシステム全体構成は下図のようにすることを前提に
しています。つまり、PICROSの配下に大勢のタスクがいて、それらの切替えを
PICROSが管理します。
そしてタスクの起動は何らかの外部要因、つまり割込み等で行われます。
その割込み処理はPICROSとは並列に割込みが発生した時点で動作し、
その処理中でPICROSが用意したサービス関数を使ってタスクの起動をします。
【PICROSのタスクとは?】
PICROSでは、ユーザ側の個々のプログラム単位を「タスク」と呼び、これが
処理の基本単位となります。タスクとPICROSの間は、サービス関数により
やり取りをします。
そしてユーザ側で割り込み禁止にしない限り、タスクの実行中は割り込み
許可状態となっており、いつでも割り込みを受け付けられる様になっています。
サービス関数からリターンした時点で既に割込みが許可されて戻って来ます。
PICROSは全てC言語で記述されています。従ってタスクもC言語で記述することを
前提にしています。もちろんインラインでアセンブラを取り入れることは可能です。
【タスクの状態と遷移】
タスクの状態には、大別すると停止状態、実行待ち状態、実行中の3つがあり、
各状態間の遷移は割込みの発生や、タスクでのサービス関数実行により引き
起こされます。
その状態遷移は下図のような関係になっています。PICROS自身を簡単な構造と
するために、タスク状態遷移も単純な構造としています。
(1) タスクの起動方法
タスクを起動し、実行待ち状態にするには2つの方法があります。
これらにより実行待ちとなったタスクの中から、優先順位に従ってひとつ
だけが実行中になります。
この実行中にするのがPICROSのスケジューラの役割です。
・Trigger_Task関数による起動
主に割込み処理から指定したタスクを実行待ち状態にします。
リターン時に割込み許可をしません。
・Request_Task関数による起動
主にタスクから指定したタスクを実行待ち状態にします。
リターン時に割込み許可状態で戻ります。
(2) タスクの終了方法
タスクを終了させ停止状態にするには、Exit_Task関数をコールします。
(3) 待ち合わせと待ち合わせ解除方法
実行待ちと実行中の間で待ち合わせの状態があり、2種類の待ち合わせ
があります。
・イベント待ち
指定したタスクからSuspend_Task関数を実行すると指定したタスクからの
イベント通知を待ち合わせます。
イベント通知はResume_Task関数を実行すると行われ、同じイベント待ちの
タスクの中で最も優先順位の高いものだけが待ち合わせ解除となり、実行
待ち状態となります。
・タイマ待ち
Wait_Timer関数を実行したときの待ち合わせで、指定時間のタイムアップ
イベントを待ち合わせます。指定時間のタイムアップになると自動的に待ち
合わせが解除され実行待ち状態となります。
タイマの基本刻みは約10msecです。
(4) タスクの状態遷移
実際のタスクの遷移は、サービス関数を実行後、そのタスクがリターンした時
だけになります。従って、Wait_Timer関数やSuspend_Task関数を実行したときにも、
タスクを終了しリターンする必要があります。