(toppers-etrobo 48) EV3の動的ローディング時におけるイベントフラグの利用について

Eiichiro Yamamoto (Nifty) eiyama-h @ nifty.com
2015年 12月 1日 (火) 10:07:01 JST


初めてメールします.山本と申します.
ここ数年,NXT上のTOPPERS/JSPを活用して,マルチタスクの動きなどを実習を通じて教えてきました.TOPPERS/JSPのような手軽なOSが使えたことで,教育用として,とても有効だったと考えています.ありがとうございました.

さて,NXTが製造中止になったので,EV3への移行を検討しており,TOPPERS/JSPで動作させていたプログラムは,TOPPERS/EV3RTのスタンドアローンでは,ほぼ同等に動作することを確認しました.
しかし,受講者がプログラムをデバッグする際の容易性を考えれば,動的ローディングのほうが良いだろうと思い,同じシステムを動的ローディングで動かそうとしたのですが,うまく動きません.

簡単に説明しますと,イベントフラグで同期をさせながら,マルチタスクで動作させようというものです.

コンフィギュレーション・ファイルは,次のようになっています.
==========
INCLUDE("app_common.cfg");

#include "app.h"
#include "testsensor.h"

DOMAIN(TDOM_APP) {

/* 周期ハンドラの定義 */
EV3_CRE_CYC(CYC0, { TA_STA, 0, cyc0, 500, 0});
EV3_CRE_CYC(CYC1, { TA_STA, 0, cyc1, 50, 0});

/*  タスクの定義 */
CRE_TSK(TSK_MAIN, { TA_ACT, 0, main_task, TMIN_APP_TPRI + 1, STACK_SIZE, NULL });
CRE_TSK(TSK_LIGHT, { TA_NULL, 0, light_sense, TMIN_APP_TPRI + 3, STACK_SIZE, NULL });
CRE_TSK(TSK_TOUCH, { TA_NULL, 0, touch_sense, TMIN_APP_TPRI + 2, STACK_SIZE, NULL });

/* イベントフラグの定義 */
CRE_FLG(EVT_FLGID, { TA_CLR, 0});

}

ATT_MOD("app.o");
ATT_MOD("testsensor.o");
ATT_MOD("Sensor.o");
ATT_MOD("TouchSensor.o");
ATT_MOD("LightSensor.o");
==========
これで実行させると,スタンドアローンの場合は,問題なく動作するのですが,動的ローディングにすると,イベントフラグに関する動作をさせるところ(wai_flgおよびset_flg)で,エラーコード-27(E_OACV)のエラーが出ます.

そこで,次のように,コンフィギュレーション・ファイルにSAC_FLGを入れて,アクセス許可ベクターを設定してみようとしました.
==========
INCLUDE("app_common.cfg");

#include "app.h"
#include "testsensor.h"

DOMAIN(TDOM_APP) {

/* 周期ハンドラの定義 */
EV3_CRE_CYC(CYC0, { TA_STA, 0, cyc0, 500, 0});
EV3_CRE_CYC(CYC1, { TA_STA, 0, cyc1, 50, 0});

/*  タスクの定義 */
CRE_TSK(TSK_MAIN, { TA_ACT, 0, main_task, TMIN_APP_TPRI + 1, STACK_SIZE, NULL });
CRE_TSK(TSK_LIGHT, { TA_NULL, 0, light_sense, TMIN_APP_TPRI + 3, STACK_SIZE, NULL });
CRE_TSK(TSK_TOUCH, { TA_NULL, 0, touch_sense, TMIN_APP_TPRI + 2, STACK_SIZE, NULL });

/* イベントフラグの定義 */
CRE_FLG(EVT_FLGID, { TA_CLR, 0});

/* アクセス許可ベクタの設定 */
SAC_FLG(EVT_FLGID, {TACP_SHARED, TACP_SHARED, TACP_KERNEL, TACP_SHARED});

}

ATT_MOD("app.o");
ATT_MOD("testsensor.o");
ATT_MOD("Sensor.o");
ATT_MOD("TouchSensor.o");
ATT_MOD("LightSensor.o");
==========
この場合は,makeの時点で,E_NOEXSのエラーが出てしまいます(こちらも,スタンドアローンであれば,makeできます).

公開されている仕様書等には,目を通したつもりなのですが,どこか見落としがあるのかもしれません.
どこに問題がありそうなのか,御教示いただければ幸いです.
よろしくお願いします.
-------------- next part --------------
HTMLの添付ファイルを保管しました...
URL: <http://www.toppers.jp/pipermail/etrobo/attachments/20151201/b3336d0d/attachment.html>