Loading article…
サイクリックエグゼクティブ[1] [2]は、リアルタイムオペレーティングシステムの代替手段です。これは協調型マルチタスクの一種で、タスクは1つだけです。単一のタスクは通常、 C言語などのmain()の無限ループとして実現されます。
基本的なスキームは、設定された頻度で、一連のアクティビティを繰り返すことです (時間トリガーの周期的実行とも呼ばれます)。たとえば、温度センサーを監視し、LCDディスプレイを更新するように設計された組み込みシステムの例を考えてみましょう。LCD には、1 秒間に 20 回 (つまり、50 ミリ秒ごとに) 書き込む必要がある場合があります。他の理由で温度センサーを 100 ミリ秒ごとに読み取る必要がある場合は、次のようなループを構築できます。
int main ( void ) { while ( 1 ) { // このループは 100 ミリ秒かかるように設計されています。つまり、 // すべてのステップを合計すると 100 ミリ秒になります。 // これはデモ コードであり、 tempRead または lcdWrite の実行にかかる時間がわからないため、 // 時間は 0 時間と想定します。// 結果として、遅延がタスクのスケジュールとタイミングを決定します。
// サイクルごとに 1 回 (100 ミリ秒ごと) 温度を読み取ります
currTemp = tempRead ();
// サイクルごとに 2 回 LCD に書き込みます (50 ミリ秒ごと)
lcdWrite ( currTemp ); delay ( 50 ); lcdWrite ( currTemp ); delay ( 50 );
// これで 100 ミリ秒 (delay(50) + delay(50) + tempRead + lcdWrite + lcdWrite)
// が経過したので、サイクルを繰り返します。} }
外側の 100 ミリ秒のサイクルはメジャー サイクルと呼ばれます。この場合、内側の 50 ミリ秒のマイナー サイクルもあります。この最初の例では、外側のサイクルと内側のサイクルは明らかではありません。メジャー サイクルとマイナー サイクルを明確にするために、カウント メカニズムを使用できます。
int main ( void ) { unsigned int i = 0 ; while ( 1 ) { // このループは 50 ミリ秒かかるように設計されています。// これはデモ コードであり、tempRead または lcdWrite の実行にかかる時間がわからないため、// 0 時間はかかると想定します。// tempRead は 100 ミリ秒ごとにのみ実行したいため、// if ステートメントを使用してカウンターが奇数か偶数かを確認し、// tempRead を実行するかどうかを決定します。
// 2 サイクルおきに (100 ミリ秒ごとに) 温度を読み取ります
if ( ( i % 2 ) == 0 ) { currTemp = tempRead (); }
// サイクルごとに 1 回 LCD に書き込みます (50 ミリ秒ごと)
lcdWrite ( currTemp ); delay ( 50 );
i ++ ;
// 50 ミリ秒が経過したので、サイクルを繰り返します。} }
参照
- Arduino - このパラダイムの代表的な例
- イベントループ
- プリエンプション(コンピューティング)
参考文献
- ^ ブルース・パウエル・ダグラス (2003)。リアルタイムデザインパターン: リアルタイムシステムのための堅牢でスケーラブルなアーキテクチャ。Addison-Wesley Longman Publishing Co., Inc. pp. 232–237。ISBN 0201699567。
- ^ Laplante, Phillip A.; Ovaska, Seppo J. (2012). リアルタイムシステム設計と分析 (第4版). ホーボーケン、ニュージャージー州: John Wiley & Sons, Inc. pp. 84–85, 100–102. ISBN 978-0-470-76864-8。
