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

YIXIAO LI liyixiao7 @ gmail.com
2015年 12月 9日 (水) 15:27:18 JST


山本様

初めまして、EV3RTの開発者の李と申します。
返信が大変遅くなり、申し訳ありません。

動的ローディング時のイベントフラグの動作について調査を行いました。
ご指摘の通り、イベントフラグに対するアクセス権が正しく設定されていないというバグがありました。

このバグを修正したバージョンEV3RT Beta 5-2が公開されました。
お手数をお掛けしてすみませんが、Beta 5-2をダウンロードして、動作確認をお願いいたします。

以上、どうぞ宜しくお願い致します。

李 奕驍(リ エキギョウ)

2015年12月1日 10:07 Eiichiro Yamamoto (Nifty) <eiyama-h @ nifty.com>:
> 初めてメールします.山本と申します.
> ここ数年,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できます).
>
> 公開されている仕様書等には,目を通したつもりなのですが,どこか見落としがあるのかもしれません.
> どこに問題がありそうなのか,御教示いただければ幸いです.
> よろしくお願いします.