• ベストアンサー

割り込み処理について

割り込み処理について 初心者です。 割り込み処理について質問させて頂きます。 (1)割り込みルーチン中から別のルーチンに飛ばすことは可能でしょうか? (2)割り込みルーチンの途中で最後まで処理を終えずに、割り込み先に復帰させることは可能でしょうか? 割り込み {    処理1    a();           ・・・(1)    処理2    return;        ・・・(2)    処理3 } 以上、よろしくお願い致します。

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

  • ベストアンサー
  • rinkun
  • ベストアンサー率44% (706/1571)
回答No.4

(1)別ルーチンに飛ばすというのがサブルーチンを呼び出すという意味なら一般的には可能です。 ただしANo.3で書かれているように、一般にサブルーチンは再入可能であることが求められます。なお、使用レジスタの保存は割込み処理ルーチンに求められるもので、サブルーチンを呼ぶからというものではないと思います。 あと、一般的に割込みスタックはそれほど深くないので可能な入れ子段数には注意が必要です。まあ組込みなら普通のプログラムでも注意は必要ですが。 別ルーチンに行ったまま帰ってこないということなら、処理系によるでしょう。割込み終了システムコールを使うなら別ルーチンで終了ということもできると思います。 (2)割込み処理ルーチンからの復帰はどこでも可能ですが、returnで戻れるかは処理系によります。 OSによっては最後はシステムコール呼び出しになっている場合があります。その場合はreturnでなくシステムコール呼び出しが必要でしょう。

ron_nast
質問者

お礼

ご回答ありがとうございます! 参考にさせて頂きます!!

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

  • tadys
  • ベストアンサー率40% (856/2135)
回答No.3

(1)割り込みルーチン中から別のルーチンに飛ばすことは可能でしょうか? 可能です。ただし、何点か注意が必要です。 a()が再入可能(リエントラント)なルーチンでないとトラブルになることが有ります。 再入可能出ない場合には、a()を実行中にa()を使用する割り込みが発生しないことを保障する必要があります。 a()で使用するレジスタが保存される必要があります。 一部のレジスタは自動的に保存されますが、保存されないレジスタが有る場合にはコンパイラに指示を出す必要があります。 どのレジスタが保存されるのか、どのように指示をするのかは環境異存なので開発環境のマニュアルを読んでください。 (2)割り込みルーチンの途中で最後まで処理を終えずに、割り込み先に復帰させることは可能でしょうか? 問題ありません。

ron_nast
質問者

お礼

ご回答ありがとうございます! 参考にさせて頂きます!!

全文を見る
すると、全ての回答が全文表示されます。
回答No.2

割り込みと一口に言っても、ハード割り込みとソフト割り込みの二種類があって 前者の場合、ms単位で処理を完了しないといけません。 なんで、他の関数を呼び出すというのは、御法度です。 後者の場合、呼び出すことは可能ですが、 割り込み処理中にまた割り込みが発生するケースを考慮しなければなりません。 というわけで、経験的には、 割り込み処理では、発生したイベント(情報)自体をスタック管理しておいて メインループにて手動で取り出してあげるというのが結構無難だったりします。 割り込みじゃないじゃんといわれてしまえばそれまでですが、 何をするにしてもプログラム的にある程度の区切りをつけておかないと 異常系の処理をするにしても都合が悪くなるのであんまり気にしたことはありません。

ron_nast
質問者

お礼

ご回答ありがとうございます! 参考にさせて頂きます!!

全文を見る
すると、全ての回答が全文表示されます。
回答No.1

>(1)割り込みルーチン中から別のルーチンに飛ばすことは可能でしょうか? 駄目です。割り込みルーチンはCPUの動作の中でも特別なものです。割り込み実行を完遂させずにユーザー(アプリケーション)のルーチンに制御を移行させることは物理的に不可能なのです。 >(2)割り込みルーチンの途中で最後まで処理を終えずに、割り込み先に復帰させることは可能でしょうか? 上記に説明したように不可能です。とにかく割り込み処理は短時間に終了させるのがコツです。 ソフトウェアの設計として、割り込みを効率的に使用するであればOSが絶対必要です。OSの存在しないプログラミングとして 割り込みルーチンでフラグを立てて、後で参照する というやり方がありますが、デバッグがとてつもなく難しくなります。 割り込み処理の一般的なコーディングは 割り込み { 割り込み処理 if(割り込みの待ちプロセスはあるか?)  待ちプロセスの起動ルーチンの実行(wake up) retuen } となります。 WindowsやLinuxのアプリケーションのプログラマなら良いのですが、組み込みシステムを設計するなら 最低限のOS(モニター) を設計できないプログラマー(エンジニア)は3流以下です。駄目人間は決まって、CPUの実行速度が遅いだのメモリが足りないだの文句を吐きます。まともな設計ができない人ほどね。今までそんな駄目プログラマーの相手をしてどれほど時間を無駄にしたやら・・・

ron_nast
質問者

お礼

ご回答ありがとうございます! 参考にさせて頂きます!!

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 割り込み処理について

    割り込み処理について 初心者です。 AVRマイコンの割り込み処理について質問させて頂きます。 INT0割り込みルーチンの途中で、条件1により割り込み発生元(メインルーチン)に復帰させてたいのですが、下記のソースに何か問題はございますか? ISR(INT0_vect,ISR_NOBLOCK) {     int0割り込み禁止          条件1         return;     処理1          条件2         return;     処理2 } よろしくお願い致します。

  • 割り込み処理について

    割り込み処理について 初心者です。 AVRマイコンの割り込み処理について質問させて頂きます。 INT0割り込みの割り込みが入ったら、割り込みルーチン中の他の割り込みを許可し、かつINT0の割り込みを禁止したいのですが、下記ソースで問題はありませんか? INT0割り込みが終了して、メインルーチンに復帰した直後にINT0割り込みを許可したいのですが、下記ソース(1)で問題はありませんか(メインルーチンに復帰した直後に許可したいのですが、方法がわかりません)? ISR(INT0_vect,ISR_NOBLOCK) {     int0割り込み禁止      ・      ・      ・      ・    (int0割り込み要求フラグクリア) ・・・・(1)        (int0割り込み許可)         ・・・・(1)   } よろしくお願い致します。

  • 本文ではなく、returnへほとんどの処理を記述

    ・本文ではなく、returnへほとんどの処理を記述しているコードがあります ・どういう意図があるのでしょうか? ・複数の関数をreturnする関数が、たくさんあります ・どの関数も、関数本文より、returnする関数内容の方が何倍も多いです hoge = function(){  //中略   return {    a : function(){   },    b : function(){  //これが延々続く  //return関数内で即時関数実行したり ■質問1 ・処理の結果をreturnすると思っていたのですが、returnメインでそこに処理を記述していくやり方のメリットは? ■質問2 ・hoge.aでアクセスしているのですが、関数定義=オブジェクト定義でしょうか? ・下記aメソッドは、同じ意味? hoge = {  a: function(){ hoge = function(){  //中略   return {    a : function(){   },

  • AVRマイコンの割り込みについて

    AVRマイコンの割り込みについて 初心者です。 ・AVRマイコンの割り込みの優先順位ですが、割込みベクターのアドレスが小さい順に優先度が高いでよろしいでしょうか? ・優先低の割り込みルーチンを処理している時に、優先高の割り込みが入った場合、  (1)優先低の割り込みルーチン処理中断→優先高の割り込みルーチンの処理、完了→優先低の割り込みルーチン処理再開(中断ヶ所から)  (2)優先低の割り込みルーチン処理、完了→優先高の割り込みルーチンの処理、完了  (3)その他 (1)、(2)、(3)のどの処理が行われますか? ・優先高の割り込みルーチンを処理している時に、優先高の割り込みを禁止し、ルーチン内で優先低の割り込みが入った場合、優先高の割り込みルーチンから優先低の割り込みルーチンにとばすことは可能でしょうか? 以上、よろしくお願い致します。

  • 繰り返し処理のシンプルな書き方

    プログラム初心者です。 下記のようなjavascript(Ajax)を作りました。 forなどで、もう少しシンプルに書く方法はありますか? var check = ['link0', '#link1','#link2']; $(check[0]).click(function () { 処理A }); $(check[1]).click(function () { 処理A }); $(check[2]).click(function () { 処理A }); ※処理Aは同じ処理 どうぞ宜しくお願い致します。

    • ベストアンサー
    • AJAX
  • プログラム内で処理中断後も継続処理を行うには?

    include を使って、次のふたつの処理を実行しようとしています。 include("a.php"); include("b.php"); $result_a=fun_a(1); $result_b=fun_b(2); さて、このとき、fun_a内で処理を中断した場合も、fun_bの処理も行わなければなりません。 fun_a内でexitを使用すると、それ以降のプログラムを実行しなくなったので、returnを使い ました。すると、fun_a内で処理を中断しても、fun_bの処理が行えました。 結果的に、よかったのですが、こうしたincludeしたプログラム内で、処理を中断した場合も、 以降のプログラムを引き続き処理する場合には、returnを使うものなのでしょうか?

    • ベストアンサー
    • PHP
  • バッグの最後の糸の処理を教えてください

    バッグを編んでいます。しかし、ここまで編んで、糸先の処理がわかりません。 見よう見真似で編みましたので最後の糸処理がわからないのです。 どなたかおわかりになる方いらっしゃいましたら教えて下さい。 よろしくお願い致します。

  • 処理について

    実はおしりの方まで少しだけ毛が生えているんですけど、処理するのは怖いしチクチクするのは嫌だしまずいかなぁ・・・と思いつつ何にもしていません。 別に多いほうじゃなく普通だと思っているのでなんともないんですけど、あそこの毛の処理をしていない女性ってどう思われますか? それに途中から処理し始めた場合どう思いますか?

  • 順番に処理させたい

    とある処理を順番どうりに処理させるにはどのような関数を入れるといいのでしょうか? タイマーで処理させていますが、 勝手に順番が入れ替わってしまうようなんです。 処理A 処理B 処理C となっています。 がなぜか処理Bが先に行われて、処理Aが行われます ※タイマーは2秒(2000MS)おきに実行し、一定の条件(その条件もタイマーで決定させる) ちなみに行数はそんなに多くないです。(多分・・・) 以上御願いします。 ちなみに .NET です。

  • 排他処理について

    VBでトランザクションをかけてあるテーブルを処理しています。 具体的にはテーブルAのレコードを一時的に別テーブル(テーブルB)に コピーしてそのレコードすべてを元のテーブルから削除して、 テーブルB内で処理をさせてから、そのデータをテーブルAに戻して コミットしています。 この処理中に、別PGもしくはSQLPlusでテーブルAからテーブルBに コピー対象の1レコードを削除してコミットしました。 これってエラーになる?ならない?それともトランザクション中だから テーブルAがコミットされて開放されるまで待ちの状態になる?? 実際どうなったかというとエラーにならなくて、その処理で最後に テーブルAにテーブルBをコピーしたときにエラーになって データがきえるという現象がおきてしまいました。 上記のような処理のときにOracle条ではどのような処理になるのでしょうか? よろしくお願いします。

このQ&Aのポイント
  • エアロフォンAE20の外部チューナーと音合わせした際のチューニング方法がわかりません。どのようにセッティングすればいいのか教えてください。
  • エアロフォンAE20の外部チューナーとのチューニングに関して困っています。具体的な方法や手順を教えていただけると助かります。
  • エアロフォンAE20の外部チューナーとのチューニング方法が分からないので質問です。外部チューナーを使用する際の設定や注意点について教えてください。
回答を見る