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

Eiichiro Yamamoto (Nifty) eiyama-h @ nifty.com
2015年 12月 10日 (木) 08:31:03 JST


李様

ご対応ありがとうございました.
EV3RT Beta 5-2にて,イベントフラグを使った当方のプログラムを
動作させたところ,問題なく動きました.

今までTOPPERS/JSPで動かしていたプログラムをTOPPERS/EV3RTで
動かすのには,多分,これで問題ないだろうと思います.

また,分からないことがあれば,相談させていただきますので,よろ
しくお願いします.


ところで,当面は,問題ないのですが,前回の質問の際に書きました
2番目の件,

> そこで,次のように,コンフィギュレーション・ファイルにSAC_FLGを入れて,アクセス許可ベクターを設定してみようとしました.
>
> この場合は,makeの時点で,E_NOEXSのエラーが出てしまいます(こちらも,スタンドアローンであれば,makeできます).

は,やはり同じエラーが出ます.
こちらは,同一のコンフィギュレーション・ファイルで,CRE_FLGとSAC_FLG
を定義しては,まずいということでしょうか.あるいは,SAC_FLGのほうの
イベントフラグの識別名(識別番号)の書き方に,何か特別な方法(頭に
制御記号を付けるとか)が必要なのでしょうか.
こちらは,とくに急ぐわけではありませんが,ご教示いただけると,今後の
参考になります.よろしくお願いします.


山本栄一郎

-----Original Message----- 
From: YIXIAO LI
Sent: Wednesday, December 9, 2015 3:27 PM
To: Eiichiro Yamamoto (Nifty) ; etrobo @ toppers.jp
Subject: (toppers-etrobo 49) Re:EV3の動的ローディング時におけるイベントフラグの利用について

山本様

初めまして、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できます).
>
> 公開されている仕様書等には,目を通したつもりなのですが,どこか見落としがあるのかもしれません.
> どこに問題がありそうなのか,御教示いただければ幸いです.
> よろしくお願いします.