EV3RTを使ってみる(3)

Toppers/EV3RTを使ってプログラムを作成したときの記事です。
この記事を書いた時のEV3RTのバージョンはβ3です。
目次はこちら

簡単なアプリケーションを作成できたのだけれども、複雑なアプリケーションを開発していくとなると、プログラムを複数のファイルに分割したくなってきます。むしろ、ファイルを分割しないと途中で投げ出したくなります。というか、app.cという適当すぎる名前のファイルにすべてのプログラムを書いていくなど美しくありません。

もちろん、EV3RTは複数のソースファイルを結合してアプリケーションを構築する方法もサポートしているようですので、今回はそれを試してみました。アプリケーションの動作は前回作成したものとまったく同じです。

まずは、アプリケーションのプログラムを作成していきます。

タスク処理の起動部分はhello.cという名前のファイルに書き、表示処理の部分はdisplay.cという名前のファイルに書きました。また、これらのソースファイルにあわせてhello.hとdisplay.hという名前のヘッダファイルも作成しています。このあたりは普通のC言語プログラムでの開発と同じです 1

void main_task(intptr_t exinf);   /* externを書く必要はなかった */
#include "ev3api.h"
#include "hello.h"
#include "display.h"

void main_task(intptr_t exinf) {
  int battery;
  ulong_t time;

  while(1){
    battery = ev3_battery_voltage_mV();
    get_tim(&time);

    display(time, battery);
    tslp_tsk(100);
  }
}
void display(ulong_t time, int battery);
#include "ev3api.h"
#include "display.h"

void display(ulong_t time, int battery)
{
  char battery_str[32];
  char time_str[32];

  sprintf(battery_str, "Battery: %d", battery);
  sprintf(time_str, "Time: %ld", time);
  
  ev3_lcd_set_font(EV3_FONT_MEDIUM);
  ev3_lcd_draw_string("HELLO EV3", 20, 20);
  ev3_lcd_draw_string(battery_str, 20, 40);
  ev3_lcd_draw_string(time_str, 20, 60);
}

次に、app.cという名前のファイルを必ず要求されるので、このファイルも作っておきます。中身はコンパイルが通るのであれば何でもいいですので、空のファイルでも作っておくのが無難でしょう。

/* 空のファイル。日記でも書いとけばいいんじゃないかな。 */

作成が必要なプログラムはここまで。次に、ビルドするための設定を作成していきます。

まずは、makeのコンパイル対象となるファイルにhello.cとdisplay.cを追加します。前回の環境構築時に作成した空のファイルMakefile.incにファイル追加の設定を書き込みます。hello.cとdisplay.cをコンパイルの対象にするには、APPL_COBJS変数にhello.oとdisplay.oを追加します。

APPL_COBJS += hello.o display.o

拡張子が .o となっていることに注意してください。「 XXX.o の基となるファイルは XXX.c である」というルールがMakefileに書かれていて、自動的に拡張子を置換してhello.cとdisplay.cをコンパイルしてくれるようになります 2

最後に、アプリケーションのビルド設定ファイルapp.cfgを作成します。前回と異なるところは、main_taskの定義をしているhello.hを読み込んでいるところと、オブジェクトファイルであるhello.oとdisplay.oを組み込むよに設定してあるところです。

INCLUDE("app_common.cfg");

#include "hello.h"

DOMAIN(TDOM_APP) {
  CRE_TSK(MAIN_TASK, { TA_ACT, 0, main_task, TMIN_APP_TPRI + 1, STACK_SIZE, NULL });
}

ATT_MOD("hello.o");
ATT_MOD("display.o");

あとは、makeを使ってアプリケーションをビルドして、ビルドしたものをEV3本体に転送してあげれば動作します。前回と同じ簡単なアプリケーションですので、動作したときの感動はあまりありませんが。
2015-03-06-1

Notes:

  1. 標準のC言語の機能をサポートしているようです。ですので、関数の宣言にexternをつける必要はありません(すべてのブロックの外側で何もつけていない宣言はexternをつけた宣言と同じ意味になります)。
  2. makeの置換機能を使った有名なビルドルールですね。makeの置換機能は大変強力で、上手く使えばソースファイルを自動的に探してコンパイルするなんてこともできます。