SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

[組込み開発入門] ロボットを作ろう

【第2回】リアルタイムOS(RTOS)とは

レゴマインドストームNXTでロボットプログラミング


  • X ポスト
  • このエントリーをはてなブックマークに追加

RTOS(TOPPERS/OSEK)を使うには

 RTOSの役割と提供機能が把握できたところで、実際に使うときの準備について説明していきます。この連載では、「レゴマインドストームNXT」上で、RTOS(OSEK仕様)を利用したプログラムを開発していきます。OSEKとは、自動車業界向けに標準化されたRTOS仕様で、色々なRTOSの中でも最もシンプルな仕様となっています。

 今回利用するOSEK仕様を実装したOS「TOPPERS/OSEK」を利用する場合は、はじめにOS上で利用するための情報を定義する必要があります。この定義情報のことをOIL(OSEK Implementaion Language)と呼びます。OILはプログラムで利用するタスクやタイマーなどの情報を定義したもので、テキストファイルで記載します。以下の図は、TOPPERS OSEK OS生成の流れについてまとめたものです。

TOPPERS OSEK OS生成の流れ
TOPPERS OSEK OS生成の流れ
1)OSで利用するタスクなどの情報を定義する

 レゴマインドストームNXT上で動作させるプログラムの中で、OSEK OSが利用するオブジェクトをOILファイルに定義します。OSEK OSが利用するオブジェクトには「タスク」「アラーム(タイマー)」「カウンタ」「リソース」があります。今回は、一定周期で処理を実行するプログラムを作成するものとして、必要となるOSオブジェクトをOILファイルに定義します。

nxtTest.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の使い方を学びながら、「組込み」のプログラミング技法を学んでいきましょう。

参考URL

LEJOS OSEK
教育用レゴ マインドストーム正規代理店

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
[組込み開発入門] ロボットを作ろう連載記事一覧

もっと読む

この記事の著者

高橋 修(タカハシ オサム)

(株)永和システムマネジメント所属パッケージ製品、IT系システムの開発を経て、組み込み分野向けツール開発に従事。組み込みソフトウェアのマニアックさとライブ感に大きな価値を感じている。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/3702 2009/03/17 10:21

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング