• ベストアンサー

μiTronでの割込み処理について

μiTron(SH4)でC言語を用いた開発を行います。 タスク間通信ではsnd_mbx,get_mbfなどを使用するのですが、 これらの関数は割り込みハンドラ内でも使えるのでしょうか? よろしくお願いします。

  • mkob
  • お礼率36% (18/50)

質問者が選んだベストアンサー

  • ベストアンサー
  • R32C
  • ベストアンサー率39% (115/290)
回答No.3

まず、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()で代替可能 となります。

mkob
質問者

お礼

回答ありがとうございます。 Hi7000/4であることが判明しましたので isnd_mbx(), iprcv_mbx() が利用可能なようです。 ありがとうございました。

その他の回答 (4)

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.5

> get_mbf というサービスコールはありません。 そうですね。 get_mpfだとばかり思っていました。(タスク間通信ではないですね) # コピペしたのでスペルはそのままになっていたりする。

  • R32C
  • ベストアンサー率39% (115/290)
回答No.4

>get_mbf()ではなく、rcv_mbf()はそのものでは不可で、 >Nortiなら、psnd_mbf()で代替可能 >Hi7000/4シリーズなら、ipsnd_mbf()で代替可能 get_mbf()ではなく、rcv_mbf()はそのものでは不可で、 Nortiなら prcv_mbf()で代替可能 Hi7000/4では、代替できません。 に訂正します。 #正確じゃなかったですね。

  • Interest
  • ベストアンサー率31% (207/659)
回答No.2

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)
回答No.1

割り込みハンドラや周期ハンドラのような「非タスクコンテキスト」では、原則として、iという接頭辞が付いたサービスコールしか使用することができません。(sns_ctxのような例外もありますが) 実装によっては、snd_mbxやget_mbfを非タスクコンテキストで使える可能性もありますし、isnd_mbxなどの非タスクコンテキスト版が用意されている場合もありますが、標準的には無理です。 なお、snd_mbxは待ち状態になる可能性がないので、非タスクコンテキスト版が存在する可能性はありますが、get_mbfは待ち状態になるのでまず無理だと思います。pget_mbfの非タスクコンテキスト版であれば、もしかすると存在するかもしれません。 どうしても割り込みハンドラ内で直接処理しなければならないのでなければ、iras_texを使って、いったんタスク例外処理ルーチンに制御を移してから、普通にsnd_mbxやget_mbfを使うのもひとつの手ではないでしょうか。

関連するQ&A

  • ITRONプログラミングについて

    はじめまして。 ITRONでネットワークプログラムの勉強をしています。 質問内容は以下の通りです。 snd_dtq();の関数を使ってタスク間メッセージをしています。 フレーム送信、受信のイベントをそれで通知しています。 ただ、しばらくするとキューエラーで通信できなくなってしまいます。 どうも、キューが枯渇しているようなのですが。。。 snd_dtq();、rcv_dtq();を使う場合、キューの獲得、解放は関数内で 行っていないのでしょうか?実装者が行う必要があるのでしょうか?

  • Ubuntu上でITRONプログラムを作成したい

    現在、企業で教育を受けていまして、開発環境の作成も含めて自分で調べていくというスタイルで UNIX環境上でのC言語プログラミングをしようとしています。 古いWindowsパソコンにVMwarePlayer2.5.5を入れて、仮想マシンにUbuntu8.04LTSを入れています。 昨日の時点で、msgsend(), msgrcv()といった関数を使ってプロセス間でテキストメッセージを やりとりするサンプルプログラムを作成しまして、今日からはこのサンプルをITRONで動くように 改造しなさい、という課題を与えられました。 ソース的には、msgsend()をsnd_msg()などを使ったものに書き換えていけばいいと思うんですが、 ・改造したソースをどうやってUbuntu上で動かすのか? ・そもそもコンパイルできるのか? ということが分からないので、アドバイスをお願いします。 学校(ポリテクの職業訓練)で、H8-Tiny(3694F)マイコン+HEWを使って、 コンパイルされたITRONライブラリを利用したライントレーサのプログラム作成をしてきたのですが、 UbuntuでITRONを動かす(?)ということについて、基本的に自分の考え方がおかしい気がしているので、 できればそのあたりも指摘もお願いします。

  • μItronでの日付の減算方法

    【OS:μItron、言語:C言語】の開発にて、 2つの時刻を比較したいのですが、 現在考えている比較方法は 2つの時刻をUTC変換し、その値を減算しようと考えています。 この処理をμItronで実現できるのでしょうか。 実現できるのであれば、その方法を教えて頂きたいです。 以上です。

  • μITRONのスタック見積もりについて

    μITRON4.0準拠のNORTi+ARMを使用し組み込み開発をしています。 質問は、スタックでオーバーフローの可能性があるため、スタックの見積もりを行いたいのですが、 (1)タスクのスタックの見積もり方法が、タスクごとにスタックを計算し足し算でよいのか(タスクごとにスタック容量を設定するので)、タスクの発生パターンを考えてそれの合計のスタックを見積もればよいのか分かりません。また計算してくれるコマンドやツールはあるのでしょうか? (2)割り込みハンドラ等の非タスクコンテキストとタスクコンテキストのスタックの関係、両者を含めてオーバーフローを考えるべきなのでしょうか? よろしくお願いいたします。

  • H8/OSを用いた割り込みで困っています。

    SH2-7045Fを用いて、MTUのTGRAとTNCTのコンペアマッチで割り込みを発生させたいのですが、かなり困っています。まず、MTUのTGRAの割り込みが発生したときの、割り込み関数の割り込み定義を、H8/OSにかいてあった、int_registでやっているのですが、これでいいのですか?あと、開発環境は、秋月でSH2を買ったときについてくるgccを使っていいるのですが、この中には割り込みマスクの設定の関数がないというのを知り、適当にインターネットから拾ったアセンブリ言語で書かれたようなもの(setIntmask())を書いているのですが、プログラムを動かしたとき割り込みを1度しか受け付けないでプログラムがおわらないで、なにかしています。教えてくださいお願いします。

  • 【組み込み開発】WindowsCEとμITRON

    組み込み系システムについて質問です 私は現在、以下通りアプリを移植を遂行しています。 【移植前アプリの環境】 OS=μITRON 言語=C# 【移植後アプリの環境】 OS=windowsCE 6.0 言語=VB.NET ※仕様はそのまま ※マシンスペックは移植後は後継機の為、僅かにCPU、メモリが良い 一通り完成し、windowsCE上でexeを実行したのですが、1つ大きな問題がありました。 それは、画面表示速度が移行前に比べ、圧倒的に遅いことです。 ファイルioを初め、中のロジックやDBは変えてないのに、表示が2~3倍遅いです。 同じリアルタイムOSであるにも関わらず、ここまでの差が出るのは、 どういった原因があるのでしょうか? 私自身組み込みシステムの開発経験が浅いため、何卒ご回答よろしくお願いします。

  • .NETの SerialPortクラスでデータ受信イベントを処理するには?

    こんばんは。いつもお世話になっております。 Visual C++ 2005でSerialPortクラスを使ってシリアル通信をしたいのですが、データ受信イベントハンドラをどのように扱えばよいか分からず困っていますのでご教示ください。 HelpやMSDN、インターネット上で検索をして見つかるのはC#の例ばかりで、C++でどのように記述するのかが見つかりませんでした。 イベントやデリゲートなど、.NETで導入された(であろう)概念が出てきたり、^(ケット)記号が出てきたりと戸惑うことも多いのですが、きっと serialPort1->DataReceived += gcnew イベントハンドラを登録; // イベントハンドラの本体 private: System::Void serialPort1_DataReceived(System::Object^ sender, System::EventArgs^ e){ ほげほげ; } みたいな感じで書くのではないかと予想しています。 Visual Basic 6.0 でのシリアル通信はずっと使ってきました。 C/C++は使い始めて10年弱、C++/CLIは未経験です。(似て非なる言語?) よろしくお願いします。

  • C言語より後に開発されたプログラミング言語は

    C言語を基にして開発されたのでしょうか? C++,C#はもちろんそうですが、Java、PHP、JavaScriptなどもそうなのでしょうか?と言うのも、C言語の関数とこれらのプログラミング言語の関数がかなり似ているところ(共通しているものも)があるからです。また、Excelの関数とも似ているのですが、これらのプログラミング言語と何か関係があるのでしょうか。

  • 処理時間

    C言語でIPプログラム開発をしています。 socketをつくって他のクライアントとのデータグラムAPを作成しました。 そこでデータを送信し始めてから終わりまでにかかった時間とデータ量を計測できる関数またはサンプルプログラムはどこかございませんでしょうか? バックグランドはwindowsです。 宜しくお願いします。

  • UNIX CプログラマがC++を学ぶには

    僕は今までUNIX上でC言語を使用し開発をしてきました。 しかし、次の仕事からマイクロソフトのVisualStudioのC++で開発するようになったのですが、 全くクラスの考えかたとか、C++の関数がわかりません。 自分のような今までUNIX Cを使用していた人間が、C++を学ぶに最適な 本があったらご紹介ください。

専門家に質問してみよう