RTOS(TOPPERS/OSEK)を使うには
RTOSの役割と提供機能が把握できたところで、実際に使うときの準備について説明していきます。この連載では、「レゴマインドストームNXT」上で、RTOS(OSEK仕様)を利用したプログラムを開発していきます。OSEKとは、自動車業界向けに標準化されたRTOS仕様で、色々なRTOSの中でも最もシンプルな仕様となっています。
今回利用するOSEK仕様を実装したOS「TOPPERS/OSEK」を利用する場合は、はじめにOS上で利用するための情報を定義する必要があります。この定義情報のことをOIL(OSEK Implementaion Language)と呼びます。OILはプログラムで利用するタスクやタイマーなどの情報を定義したもので、テキストファイルで記載します。以下の図は、TOPPERS OSEK OS生成の流れについてまとめたものです。
1)OSで利用するタスクなどの情報を定義する
レゴマインドストームNXT上で動作させるプログラムの中で、OSEK OSが利用するオブジェクトをOILファイルに定義します。OSEK OSが利用するオブジェクトには「タスク」「アラーム(タイマー)」「カウンタ」「リソース」があります。今回は、一定周期で処理を実行するプログラムを作成するものとして、必要となるOSオブジェクトをOILファイルに定義します。
#include "implementation.oil" CPU ATMEL_AT91SAM7S256 { <省略> /** * タスク定義 * */ TASK HighTask { AUTOSTART = FALSE; SCHEDULE = FULL; PRIORITY = 3; ACTIVATION = 1; SCHEDULE = FULL; STACKSIZE = 512; RESOURCE = lcd; }; /** * カウンタ * */ COUNTER SysTimerCnt { MINCYCLE = 1; MAXALLOWEDVALUE = 10000; TICKSPERBASE = 1; }; ALARM cyclic_alarm1 { COUNTER = SysTimerCnt; ACTION = ACTIVATETASK { TASK = HighTask; }; AUTOSTART = TRUE { ALARMTIME = 1000; CYCLETIME = 3000; APPMODE = appmode1; }; };
それでは、順番にコードの中身を見ていきましょう。
#include "implementation.oil"
必ず"implementation.oil"を先頭でinclude
します。
CPU ATMEL_AT91SAM7S256 { <省略> /** * タスク定義 * */ TASK HighTask { AUTOSTART = FALSE; SCHEDULE = FULL; PRIORITY = 3; ACTIVATION = 1; SCHEDULE = FULL; STACKSIZE = 512; RESOURCE = lcd; };
タイマーから実行されるタスクを定義しています。このタスクの本体としてコーディングされたプログラムが、タスクの呼び出し元タイマーの周期で実行されます。
/** * カウンタ * */ COUNTER SysTimerCnt { MINCYCLE = 1; MAXALLOWEDVALUE = 10000; TICKSPERBASE = 1; };
周期的にカウントアップされる「カウンタ」を定義しています。なお、カウントアップは、後述するタイマーにより行われます。
ALARM cyclic_alarm1 { COUNTER = SysTimerCnt; ACTION = ACTIVATETASK { TASK = HighTask; }; AUTOSTART = TRUE { ALARMTIME = 1000; CYCLETIME = 3000; APPMODE = appmode1; }; };
周期的に処理を行うアラーム(タイマー)を定義しています。このアラームでは、次の2つの処理を周期・定期に実行しています。
1)カウンタの加算
先に定義したカウンタと関連づけて周期的にカウントアップします。
2)タスクの起動
先に定義したタスクを周期的に実行します。
今回利用するTOPPERS/OSEKのOS API仕様やOIL仕様の資料は、こちらからダウンロードすることができます。定義仕様については、ダウンロードした資料を参考にしてください。
2)OSのソースコードを生成する
「LEJOS OSEK」を利用している場合、Cygwin上でmake
コマンドを実行することで、OSのソースコード生成とコンパイルが一度に行われます。
最後に
今回は、組込みソフトウェアにおけるRTOSの役割とその機能について学びました。次回からは、実際にRTOSを活用したプログラムの作成を行ってRTOSの使い方を学びながら、「組込み」のプログラミング技法を学んでいきましょう。