wiki:FAQ

Version 14 (modified by ertl-yutaka, 9 years ago) ( diff )

--

FAQ

TOC(depth=1, WhatsEV3RT, Download, DevEnv, SampleProgram, UserManual, EV3RTsAPI, FAQ, Contacts)

ダイナミックローディング/アプリケーションローダ(apploader)に関する質問

Q:ダイナミックローディングによりアプリケーションを実行しようとしています。app loader で「Load app from SD card」を選択すると、「Open application folder '/ev3rt/apps' failed.」というエラーが出ます。何が原因でしょうか?

A:いくつか原因が考えられます。以下を確認してください。

  • SDカードがFATで初期化されているか?
  • SDカード内に /ev3rt/apps/ ディレクトリが存在しているか?
  • SDHC対応4GB以上のSDカードを使用しているか?

Q:ダイナミックローディングでアプリケーションを実行するために、 workspace ディレクトリの下に app ファイルを作成しました。複数のアプリケーションを実行する場合、ファイル名が同じになってしまうのですがどうすれば良いでしょうか? app ファイルの名称を変更しても良いでしょうか?

A:はい、変更して構いません。複数のアプリケーションを試す場合には、それぞれのapp ファイルの名称を変更し、SDカードの /ev3rt/apps/ の下に保存してください。apploader で、アプリケーションのファイル名を選択すれば、再起動することなしに、アプリケーションを切り替えることができます。

アプリケーションの開発方法に関する質問

Q:周期的な処理を追加するためには、どうすれば良いでしょうか?

A:(1) app.cfg ファイルに、EV3_CRE_CYCを使って周期ハンドラを作成します。以下の例に従って、cfgファイルに追記してください。

DOMAIN(TDOM_APP) {
    ...
    EV3_CRE_CYC(TEST_EV3_CYC1, { TA_STA, 0, test_ev3_cychdr, 500, 0 });  ← この行を追加
    ...
}
ATT_MOD(app.o)

EV3_CRE_CYCの各パラメータの意味は、以下の通りです。

  • 【第1パラメータ】TEST_EV3_CYC1:周期ハンドラの名称(実際にはID番号だが、コンフィギュレータによって、ここで指定した名称のマクロが自動的に定義される)
  • 【第2パラメータ】TA_STA:周期ハンドラの属性。
    • TA_STAを指定すると、アプリケーションの起動時に周期処理も開始する。
    • TA_NULLを指定すると、アプリケーションでEV3_sta_cyc(TEST_EV3_CYC1)を呼び出すまで動作しない。
  • 【第3パラメータ】0:周期ハンドラに渡される値(拡張情報)
  • 【第4パラメータ】test_ev3_cychdr:周期ハンドラの先頭番地(周期的に実行される関数)。Cファイルに同名の関数を定義してください((2)を参照のこと)。
  • 【第5パラメータ】500:起動周期(EV3RTの場合、単位はマイクロ秒で指定)
  • 【第6パラメータ】0:起動位相。周期ハンドラの動作開始を指定してから、最初に周期ハンドラが呼ばれるまでの相対時間。
    • 属性にTA_STAを指定して、起動位相に0を指定するとシステムが起動して最初のタイムティックが発生した時に動作する。

詳細は、TOPPERS次世代カーネル統合仕様書のCRE_CYCの説明を参照してください。

(2) アプリケーションのCファイルに周期ハンドラの関数を追加します。例えば、app.h と app.c に以下を追加します。

  • app.h
extern void test_ev3_cychdr(intptr_t exinf);
  • app.c
static int count;

void test_ev3_cychdr(intptr_t idx) {
    char buf[100];
    sprintf(buf, "EV3CYC %d count %d", idx, ++count);
    ev3_lcd_draw_string(buf, 0, 0); // EV3のLCDに文字列 buf を表示
}

Q:タスクの優先度を変更するには、どうすれば良いでしょうか?

A:cfg ファイルに記述してある CRE_TSK のパラメータを変更します。

gyroboy のサンプルを例に説明します。workspace/gyroboy/app.cfg に以下の記述があります。

DOMAIN(TDOM_APP) {
    CRE_TSK(BALANCE_TASK, { TA_NULL, 0, balance_task, TMIN_APP_TPRI, STACK_SIZE, NULL });
    CRE_TSK(MAIN_TASK, { TA_ACT, 0, main_task, TMIN_APP_TPRI + 1, STACK_SIZE, NULL });
    CRE_TSK(IDLE_TASK, { TA_NULL, 0, idle_task, TMIN_APP_TPRI + 2, STACK_SIZE, NULL });
}

CRE_TSKの各パラメータの意味は、以下の通りです。

  • 【第1パラメータ】BALANCE_TASK:タスクの名称(実際にはID番号だが、コンフィギュレータによって、ここで指定した名称のマクロが自動的に定義される)
  • 【第2パラメータ】TA_NULL:タスクの属性。
    • TA_ACTを指定すると、アプリケーション起動時にタスクを実行可能状態に遷移させる。
    • TA_NULLを指定すると、アプリケーション起動時には休止状態である。
  • 【第3パラメータ】0:タスクに渡される値(拡張情報)
  • 【第4パラメータ】balance_task:タスクのメインルーチンの先頭番地(周期的に実行される関数)。
  • 【第5パラメータ】TMIN_APP_TPRI:タスクの起動時優先度。EV3RTの場合、TMIN_APP_TPRIは、タスクに指定できる最高優先度(値は最小値)を示す。
    • 数値を小さくすると優先度が高くなり、大きくすると優先度が下がる。
    • したがって、この例では、BALANCE_TASK, MAIN_TASK, IDLE_TASKの順に高い優先度が設定されている。
  • 【第6パラメータ】STACK_SIZE:タスクのスタック領域のサイズ。
  • 【第7パラメータ】NULL:タスクのスタック領域の先頭番地
    • NULLとした場合,第6パラメータで指定したサイズのスタック領域が,コンフィギュレータまたはカーネルにより確保される。

詳細は、TOPPERS次世代カーネル統合仕様書のCRE_TSKの説明を参照してください。また、アプリケーションの動作中に優先度を変更する cfg_pri というAPIもあります。

Bluetooth 接続に関する質問

Q:Bluetooth のデバイス名(PCで検索したときに表示される名称)を変更する方法はありますか?

A:hrp2/target/ev3_gcc/ev3.hのBLUETOOTH_LOCAL_NAME というマクロを修正して,もう一度ビルドしてください.例えば,

#define BLUETOOTH_LOCAL_NAME   ("Mindstorms EV3") //!< Name for service discovery
↓
#define BLUETOOTH_LOCAL_NAME   ("TEST EV3") //!< Name for service discovery

と修正すると,Bluetoothデバイスを検索した時に,TEST EV3 という名称で表示されるようになります.

Note: See TracWiki for help on using the wiki.