(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>