組み込みも、はじめの一歩はHello world

2011年6月6日(月)
吉田 彩花舟元 拓斗

レッツ!ハローワールド!!

  1. [舟元]説明ばっかりだと、よく分からないだろうし、1回プログラミングして動かしてみようか。
  2. [吉田]そうですね。あまり難しい話しばかりだと眠く。。。
  3. [舟元]じゃあ、実際にプログラミングする前に、今回の環境を整理しておこうか。まずは、ハードウェアね。

走行体はコンピュータとなるNXT本体を中核に、以下のセンサーやアクチュエータが接続されています。

センサー 光センサ、タッチセンサ、超音波センサ、ジャイロセンサ
アクチュエータ サーボモータ
  1. [舟元]次は、ソフトウェア。ETロボコンでは、nxtOSEKというオープンソースのリアルタイムOSとハードウェアを動かすためのライブラリがセットになったものを使うんだ。

走行体用のソフトウェアを開発する際には、nxtOSEKを利用するため、以下のソフトウェアを利用します。

コンパイルプラットホーム cygwin
コンパイラ GNUARM
ミドルウェア nxtOSEK
ソフトウェア転送用ツール NeXTTool
  1. [舟元]それじゃ、nxtOSEKのサイトを見ながら、開発に必要なものをパソコン上にインストールしよう。
  2. [吉田]手を動かす作業ですねっ!やっと睡魔から開放される!!

nxtOSEKでの開発手順は、公式サイトの「 拡張NXTファームウェア + nxtOSEKのインストール方法(Windows XP/Vista/7) 」 に記載されています。この手順どおりに開発環境をセットアップしてください。

また、nxtOSEKを利用したソフトウェアをコンパイルするためには、別途System Generatorも必要になります。 nxtOSEKのダウンロードページ にある「 お知らせ: nxtOSEKからのsg.exeの削除について(2010/03/01) 」を参照してSystem Generator(sg.exe)をコピーしてください。

今回は、nxtOSEKとNeXTToolはnxtOSEKのサイトにある例のとおりインストールしているものとします。

---- cygwinでのパス Windowsでのパス
nxtOSEK /nxtOSEK C:\cygwin\nxtOSEK
NeXTTool /nexttool C:\cygwin\nexttool
  1. [吉田]デキタッ!!いろいろと設定しないといけないことやインストール先を注意しないといけないので、注意が必要ですね。
  2. [舟元]開発環境のセットアップは、何度もやるものじゃないからね。良い経験だよ。さて次は、開発環境が正しくセットアップされていることの確認も含めて、 "Hello, World" を作って動かしてみようか。

今回は、開発環境の動作確認と開発手順を確認するために、画面に"Hello, World!!"と表示しNXTのENTERキー(オレンジ色のキー)を押すことで終了するソフトウェアを作ってみます。詳細は次回以降で説明していく予定ですが、余裕のある方は今回呼び出している関数について nxtOSEK公式サイトのAPIリファレンス を参照し、各関数を呼び出しときに、どうなるかを確認してみると良いでしょう。

まずは、作業用のディレクトリ(フォルダ)を作成します。cygwinを起動し、表示される $ に続けて以下のように入力し、エンターキーを押します。( $ 自身は入力する必要はありません。)

$ mkdir -p thinkit/helloworld

ここで作成したディレクトリは、Windowsのエクスプローラからは C:\cygwin\use_name\thinkit\helloworld (user_nameとなっているところは、実際のユーザ名に置き換えてください。)となります。このディレクトリに以下の3つのファイルを保存します。

Makefile:

TARGET = helloworld
TARGET_SOURCES = helloworld.c
TOPPERS_OSEK_OIL_SOURCE = ./helloworld.oil

O_PATH ?= build
include ../../../../ecrobot/ecrobot.mak

helloworld.c:

#include "kernel.h"
#include "kernel_id.h"
#include "ecrobot_interface.h"

// 1ミリ秒間隔で呼び出される。
// 今回は何もしない。
void user_1ms_isr_type2() {
}

TASK(Main) {
    U32 pressed_counter;

    // 画面をクリアして文字列を表示。
    display_clear(0);
    display_goto_xy(0, 0);
    display_string("hello, world!!");
    display_update();

    // 10ミリ秒間隔でENTERボタンを確認する。
    // ENTERボタンが押された状態が10回(100ミリ秒)続いたら終了。
    pressed_counter = 0;
    while (pressed_counter < 10) {
        if (ecrobot_is_ENTER_button_pressed() == 1) {
            ++pressed_counter;
        } else {
            pressed_counter = 0;
        }
        systick_wait_ms(10);
    }
    

    // 終了待ちループ
    // 四角いグレーのボタンを押して電源OFF。
    while (1) {
        systick_wait_ms(100);
    }
}

helloworld.oil:

#include "implementation.oil"

CPU ATMEL_AT91SAM7S256
{
  OS LEJOS_OSEK
  {
    STATUS = EXTENDED;
    STARTUPHOOK = FALSE;
    ERRORHOOK = FALSE;
    SHUTDOWNHOOK = FALSE;
    PRETASKHOOK = FALSE;
    POSTTASKHOOK = FALSE;
    USEGETSERVICEID = FALSE;
    USEPARAMETERACCESS = FALSE;
    USERESSCHEDULER = FALSE;
  };

  APPMODE appmode1{};

  TASK Main
  {
    AUTOSTART = TRUE
    {
      APPMODE = appmode1;
    };
    PRIORITY = 1;
    ACTIVATION = 1;
    SCHEDULE = FULL;
    STACKSIZE = 512;
  };
};
  1. [吉田]うひゃぁ。こんなに書かないと動かないんですかっ!?
  2. [舟元]プログラムといえる部分はhelloworld.cだけなんだけど、定義とか設定に関わるものもあるから、ちょっと多めになっちゃうね。よし、ファイルが揃ったらコンパイルだ。

コンパイルは、cygwinにインストールされている make を利用します。先ほど作ったディレクトリに移動し、以下のようにコマンドを入力します。( $ 自体は入力不要です。各行の終わりでエンターキーを入力します。)

$ cd thinkit/helloworld
$ make all

問題がなければ、以下のとおりの出力されコンパイルが完了します。

Generating binary image file: helloworld_rom.bin
Generating binary image file: helloworld_ram.bin
Generating binary image file: helloworld.rxe
  1. [舟元]よし、コンパイル完了。次はNXTに転送して実行だ。

コンパイルが完了すると、ソフトウェアを転送するためのスクリプトも生成されます。パソコンとNXTをUSBで接続し、NXTの電源を入れます。先ほどのcygwinの続きに以下のコマンドを実行します。

$ sh rxeflash.sh

正しく転送された場合は、以下のように出力されます。

Executing NeXTTool to upload helloworld.rxe...
helloworld.rxe=17328
NeXTTool is terminated.

転送が完了すると、いよいよ実行です。実行はNXTの電源を入れ、以下に図示するとおり操作します。

図7:電源投入後からソフトウェアの起動までの操作
  1. [吉田]おぉー!!動きましたよ。出ました!ハローワールド!!
  2. [舟元]出たねぇ。オメデトウ。組み込みデビューだ。
  3. [吉田]うーん。でも、このhelloworld.oilとかって何なんですか?main関数が無いのに動いちゃうんですね。
  4. [舟元]あれ、手を動かしたら眠気が吹っ飛んだ?今回の作ったソフトウェアだけでも説明し始めると長くなっちゃうから、続きは次回だね。
  5. [吉田]そうしましょう。私も覚えることばかりでパンク寸前です。では、お疲れさまでぇす。

次回は、動作確認で使ったソフトウェアの説明から実際にETロボコンの走行体を動かせればと思っています。

※レゴ、レゴ マインドストームは、レゴグループの登録商標です。

【参照リンク】

ETロボコン2011公式サイト

<最終アクセス:2011.05>

株式会社 永和システムマネジメント

永和システムマネジメントに2011年入社。文系出身で右も左もプログラミングも分からない中、ETロボコンへの参加を命じられ四苦八苦中。

株式会社 永和システムマネジメント

永和システムマネジメントに2011年入社。学生時代に二度ETロボコンに参戦。配属されてから役に立ちそうな技術・知識を盗むべく奮闘中。

連載バックナンバー

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています