- ベストアンサー
割り込み処理について
割り込み処理について 初心者です。 割り込み処理について質問させて頂きます。 (1)割り込みルーチン中から別のルーチンに飛ばすことは可能でしょうか? (2)割り込みルーチンの途中で最後まで処理を終えずに、割り込み先に復帰させることは可能でしょうか? 割り込み { 処理1 a(); ・・・(1) 処理2 return; ・・・(2) 処理3 } 以上、よろしくお願い致します。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
(1)別ルーチンに飛ばすというのがサブルーチンを呼び出すという意味なら一般的には可能です。 ただしANo.3で書かれているように、一般にサブルーチンは再入可能であることが求められます。なお、使用レジスタの保存は割込み処理ルーチンに求められるもので、サブルーチンを呼ぶからというものではないと思います。 あと、一般的に割込みスタックはそれほど深くないので可能な入れ子段数には注意が必要です。まあ組込みなら普通のプログラムでも注意は必要ですが。 別ルーチンに行ったまま帰ってこないということなら、処理系によるでしょう。割込み終了システムコールを使うなら別ルーチンで終了ということもできると思います。 (2)割込み処理ルーチンからの復帰はどこでも可能ですが、returnで戻れるかは処理系によります。 OSによっては最後はシステムコール呼び出しになっている場合があります。その場合はreturnでなくシステムコール呼び出しが必要でしょう。
その他の回答 (3)
- tadys
- ベストアンサー率40% (856/2135)
(1)割り込みルーチン中から別のルーチンに飛ばすことは可能でしょうか? 可能です。ただし、何点か注意が必要です。 a()が再入可能(リエントラント)なルーチンでないとトラブルになることが有ります。 再入可能出ない場合には、a()を実行中にa()を使用する割り込みが発生しないことを保障する必要があります。 a()で使用するレジスタが保存される必要があります。 一部のレジスタは自動的に保存されますが、保存されないレジスタが有る場合にはコンパイラに指示を出す必要があります。 どのレジスタが保存されるのか、どのように指示をするのかは環境異存なので開発環境のマニュアルを読んでください。 (2)割り込みルーチンの途中で最後まで処理を終えずに、割り込み先に復帰させることは可能でしょうか? 問題ありません。
お礼
ご回答ありがとうございます! 参考にさせて頂きます!!
- tsuduki123
- ベストアンサー率32% (21/65)
割り込みと一口に言っても、ハード割り込みとソフト割り込みの二種類があって 前者の場合、ms単位で処理を完了しないといけません。 なんで、他の関数を呼び出すというのは、御法度です。 後者の場合、呼び出すことは可能ですが、 割り込み処理中にまた割り込みが発生するケースを考慮しなければなりません。 というわけで、経験的には、 割り込み処理では、発生したイベント(情報)自体をスタック管理しておいて メインループにて手動で取り出してあげるというのが結構無難だったりします。 割り込みじゃないじゃんといわれてしまえばそれまでですが、 何をするにしてもプログラム的にある程度の区切りをつけておかないと 異常系の処理をするにしても都合が悪くなるのであんまり気にしたことはありません。
お礼
ご回答ありがとうございます! 参考にさせて頂きます!!
- 正親町(@Ohgimachi)
- ベストアンサー率43% (110/252)
>(1)割り込みルーチン中から別のルーチンに飛ばすことは可能でしょうか? 駄目です。割り込みルーチンはCPUの動作の中でも特別なものです。割り込み実行を完遂させずにユーザー(アプリケーション)のルーチンに制御を移行させることは物理的に不可能なのです。 >(2)割り込みルーチンの途中で最後まで処理を終えずに、割り込み先に復帰させることは可能でしょうか? 上記に説明したように不可能です。とにかく割り込み処理は短時間に終了させるのがコツです。 ソフトウェアの設計として、割り込みを効率的に使用するであればOSが絶対必要です。OSの存在しないプログラミングとして 割り込みルーチンでフラグを立てて、後で参照する というやり方がありますが、デバッグがとてつもなく難しくなります。 割り込み処理の一般的なコーディングは 割り込み { 割り込み処理 if(割り込みの待ちプロセスはあるか?) 待ちプロセスの起動ルーチンの実行(wake up) retuen } となります。 WindowsやLinuxのアプリケーションのプログラマなら良いのですが、組み込みシステムを設計するなら 最低限のOS(モニター) を設計できないプログラマー(エンジニア)は3流以下です。駄目人間は決まって、CPUの実行速度が遅いだのメモリが足りないだの文句を吐きます。まともな設計ができない人ほどね。今までそんな駄目プログラマーの相手をしてどれほど時間を無駄にしたやら・・・
お礼
ご回答ありがとうございます! 参考にさせて頂きます!!
お礼
ご回答ありがとうございます! 参考にさせて頂きます!!