- ベストアンサー
μiTronでの割込み処理について
μiTron(SH4)でC言語を用いた開発を行います。 タスク間通信ではsnd_mbx,get_mbfなどを使用するのですが、 これらの関数は割り込みハンドラ内でも使えるのでしょうか? よろしくお願いします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
まず、get_mbf というサービスコールはありません。メッセージバッファだとすれば rcv_mbfになります。 SH4だと renesas純正のHi7000/4シリーズか、 mispoのNortiかと思います。それ以外でしたらすいません。 uITRONの仕様に近いHi7000/4では、 isnd_mbx(), iprcv_mbx() で利用可能です。 ただし、メッセージバッファは、 ipsnd_mbf()はあるものの、iprcv_mbf()は実装されていません。 ですので、ハンドラでメッセージバッファの受信はできません。 一方 Nortiの方は、(NORTi is not only ITRONというコンセプトもそうかと思えてしまいますが) snd_mbx() と prcv_mbx() で対応できます。 psnd_mbf()とprcv_mbf()で対応できます。 Nortiの仕様として非タスクコンテキスト、タスクコンテキストをカーネル内部で判定して、 適切に処理を呼び出すようです。ただ、rcv_mbx()はタスクの待ち状態があるため、非タスクコンテキスト で呼び出されたら、E_CTXを返す仕様になっているようです。 正確な解答とすれば、 snd_mbx()はNortiならハンドラで利用可能 Hi7000/4シリーズなら isnd_mbx()で代替できます。 get_mbf()ではなく、rcv_mbf()はそのものでは不可で、 Nortiなら、psnd_mbf()で代替可能 Hi7000/4シリーズなら、ipsnd_mbf()で代替可能 となります。
その他の回答 (4)
- jacta
- ベストアンサー率26% (845/3158)
> get_mbf というサービスコールはありません。 そうですね。 get_mpfだとばかり思っていました。(タスク間通信ではないですね) # コピペしたのでスペルはそのままになっていたりする。
- R32C
- ベストアンサー率39% (115/290)
>get_mbf()ではなく、rcv_mbf()はそのものでは不可で、 >Nortiなら、psnd_mbf()で代替可能 >Hi7000/4シリーズなら、ipsnd_mbf()で代替可能 get_mbf()ではなく、rcv_mbf()はそのものでは不可で、 Nortiなら prcv_mbf()で代替可能 Hi7000/4では、代替できません。 に訂正します。 #正確じゃなかったですね。
- Interest
- ベストアンサー率31% (207/659)
ITRONは、具体的にどこの何というOSを使用されるのでしょうか? とりあえず一般論として、μITRON 4.0仕様書に基づいて回答します。 まず、割り込みハンドラ内での処理は「非タスクコンテキスト」に相当します。コンテキストとは、プログラムが実行される環境のことで、uITRON4.0仕様ではタスク処理の一部と見做すことのできるコンテキストを総称して「タスクコンテキスト」、そうでないコンテキストを総称して「非タスクコンテキスト」と呼びます。割り込みハンドラが実行されるコンテキストは非タスクコンテキストに分類されます。 非タスクコンテキストから呼び出せるサービスコールは、サービスコール名の先頭に'i'をつけることが規定されています。具体的には、次のサービスコールがこれに相当します。 iact_tsk, iwup_tsk, irel_wai, iras_tex, isig_sem, iset_flg, ipsnd_dtq, ifsnd_dtq, isig_tim, irot_rdq, iget_tid, iloc_cpu, iunl_cpu (uITRON 4.0仕様書 3.6章 非タスクコンテキストからのサービスコール呼び出し より) http://www.ertl.jp/ITRON/SPEC/mitron4-j.html 上記のとおり、割り込みハンドラ内でsnd_mbx,get_mbfは使用できません。
- jacta
- ベストアンサー率26% (845/3158)
割り込みハンドラや周期ハンドラのような「非タスクコンテキスト」では、原則として、iという接頭辞が付いたサービスコールしか使用することができません。(sns_ctxのような例外もありますが) 実装によっては、snd_mbxやget_mbfを非タスクコンテキストで使える可能性もありますし、isnd_mbxなどの非タスクコンテキスト版が用意されている場合もありますが、標準的には無理です。 なお、snd_mbxは待ち状態になる可能性がないので、非タスクコンテキスト版が存在する可能性はありますが、get_mbfは待ち状態になるのでまず無理だと思います。pget_mbfの非タスクコンテキスト版であれば、もしかすると存在するかもしれません。 どうしても割り込みハンドラ内で直接処理しなければならないのでなければ、iras_texを使って、いったんタスク例外処理ルーチンに制御を移してから、普通にsnd_mbxやget_mbfを使うのもひとつの手ではないでしょうか。
お礼
回答ありがとうございます。 Hi7000/4であることが判明しましたので isnd_mbx(), iprcv_mbx() が利用可能なようです。 ありがとうございました。