• ベストアンサー

割り込み処理(H14春22)

以下の基本情報処理問題の解答を見ても理解し切れません。 ご助言お願いします。 【問22】割込みが発生すると,あるアドレスが退避され,割込み処理が実行される。割込み処理が完了すると,退避されていたアドレスが復帰され,割込み直前に実行していたプログラムの実行が再開される。退避されていたアドレスはどれか。 ア 割込みが発生したときに実行していた命令のアドレス イ 割込みが発生したときに実行していた命令の次の命令のアドレス ウ 割込み処理の最後の命令のアドレス エ 割込み処理の先頭の命令のアドレス 【答】イ 割込みが発生すると実行されていたプログラムが中断され、割込み処理が実行される。 割込み処理が完了すると退避されていたアドレスが復帰され、割込み直前に実行していた元のプログラムの実行が再開される。 その場合、割込みが発生したときに実行していた命令の次の命令のアドレスが実行される。 【コメント】 下のような流れになると思っています。 なぜ「次の命令のアドレス」が出てくるのか、教えて頂けませんか。 (1)処理実行中 (2)割り込み発生 (3)(1)を中断し、どこかに退避 (4)(2)を実行 (5)(2)が完了したので、(1)を元に戻す (6)(1)を実行(割り込み前に戻る)

noname#99096
noname#99096

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

  • ベストアンサー
回答No.6

「命令処理の中断」ではなく「(命令の塊としての)プログラムの処理がが中断」という意味なので合ってはいますけど,確かに分かりにくい表現でしょう。 CPUの動きを複数の人でやっている流れ作業みたいなのにたとえて考えると良いと思います。 流れ作業をしているときに「ちょっとこれをお願い!」と言われて,もし今やっている処理をいきなり中断させようとしたら,全員の「やりかけ」のものを退避するか,全部やりかけ前の状態に戻さなくてはなりません。 でも,全員のやりかけ状態を退避したり、「全員がやりかけ前に戻す」っていうのは非常に面倒くさいですよね? そこで流れ作業の先頭からプログラムの続きを読み込ませるのをやめて「今やってるのが終わったらこれをお願い!」とするわけです。これでCPU設計が格段に楽になります。 したがって流れ作業の先頭が今処理にかかった命令・・つまり今まさに実行しようとしている命令と次の命令の間に割込み処理が挟まるような動きになるわけですね。

noname#99096
質問者

お礼

遅くなりました、ご回答ありがとうございます。 まさに私が勘違いしていた部分です。 「命令の中断」ではなく、その命令を含んだ「プログラムの中断」なんですね。 >今まさに実行しようとしている命令と次の命令の間に割込み処理が挟まるような動き 「プログラムA→プログラム割→プログラムB」ではなく、 「命令1→命令2→命令3→「プログラム割」→命令4→命令5…」となるイメージですね。 イメージし易い例をありがとうございます。 ご回答締め切らせて頂きます。

その他の回答 (6)

  • pc_net_sp
  • ベストアンサー率46% (468/1003)
回答No.7

PICマイコンのプログラミングでも時々間違えるんですよね~ 割り込みをかける場所。 プログラム実行させて割り込みがかかった時だけ誤動作・フリーズが起こる。 まだまだ私もプログラミングは素人という事でしょうか・・・

  • ybnormal
  • ベストアンサー率50% (220/437)
回答No.5

>そうなると、解答にある >「割込みが発生すると実行されていたプログラムが『中断』され」と >「割込み『直前』に実行していた元のプログラムの実行が再開され >る」は誤った表現なんでしょうか 実行中の命令を中断ではなくプログラムを中断と書かれているので間違いではありません。 割り込み要求が来た場合、新たな命令の発行を止め、現在実行中の命令(パイプライン処理をしていれば、複数命令あるのが普通)を全て終了させてCPUを「静か」な状態にしてから、割り込みハンドラに飛びます。このときに退避されるPCは、次に発行される命令を指していますから、割り込みから戻ってプログラムを再開すると、割り込み発生時に実行中であった最後の命令の次の命令から実行が再開されます。

noname#99096
質問者

お礼

遅くなりました、ご回答ありがとうございます。 根本的に「命令」と「プログラム」を同じものだと読み違えていました。 的確なご指摘ありがとうございます。 割り込み発生時に実行していた命令は、「完全に終わらせる」事がポイントですね。

  • pc_net_sp
  • ベストアンサー率46% (468/1003)
回答No.4

自己訂正 誤 プログラム3実行中に割り込みが発生したとする。(割) 正 アドレス3実行中に割り込みが発生したとする。(割)

noname#99096
質問者

お礼

遅くなりました、ご回答ありがとうございます。 皆さんのご回答を何度読んでも、いまいちスッキリしなかったのですが、 自己訂正された事で、ようやく食い違いに気付けました。

  • pc_net_sp
  • ベストアンサー率46% (468/1003)
回答No.3

情報処理は分かりませんが、、、 >解説の表現が悪いのでしょうか。 表現に引っかけじみた事も書いてないです。 プログラム実行 12345678 プログラム3実行中に割り込みが発生したとする。(割) 123割45678 っとなる。 よって実行していたアドレス3で、 実行していた命令の次の命令のアドレス4ですから、 答えはイ            

noname#99096
質問者

お礼

遅くなりました、ご回答ありがとうございます。 自己訂正して頂いた事が理解につながりました。 プログラムA(12345678) プログラムB(一二三四五六七八) プログラムZ(壱弐参…) プログラムAの3で割り込み発生した場合 ・割込み発生時、『中断』されるのは「プログラムA」 ・退避されるのは、「プログラム単位」ではなく「命令4(のアドレス)」 ←勘違いポイント ・「割り込み直前に実行していた元のプログラム再開」は、「命令4」(広義でPGA)の実行を指している ・「プログラムA→割→B」ではなく、1→2→3→「プログラムZ」→4→5… となる 「プログラム」と、その中にある「命令」がごっちゃになってました。 ありがとうございました。

  • rabbit_cat
  • ベストアンサー率40% (829/2062)
回答No.2

普通のCPUは、割り込みの処理は、今実行している命令が終わってから実行されます。 なんで、割り込みから戻るときには、次のアドレスになります。

noname#99096
質問者

お礼

ご回答ありがとうございます。 No.1の方と同意見ですね、それがCPU割り込みの普通の流れなんですね。 そうなると、やっぱり解説の表現が悪いのでしょうか。 もしくは私の読解力がないのか…

回答No.1

退避していた時の命令は割込発生時点では終了しているので、退避していたアドレスに戻って、再度実行して今うと、2回実行してしまうからです。 たとえば、 CPUが 1 2 3 と実行したときに割込が発生し、一通り実行し終わって戻った時には、3からではなく、4から実行したいからです。

noname#99096
質問者

お礼

ご回答ありがとうございます。 なるほど、割り込み発生時に実行してる処理は完了させるのですね。 そうなると、解答にある 「割込みが発生すると実行されていたプログラムが『中断』され」と 「割込み『直前』に実行していた元のプログラムの実行が再開される」は誤った表現なんでしょうか 公式ではないサイトからの引用ですので

関連するQ&A

  • 基本情報処理技術者試験 質問

    プログラムを実行中に、スーパーバイザコールなどの割込みが入ったとき、「プログラムカウンタの値やレジスタの値が一時退避し、割り込みの処理が終わったらその値は戻ってくる」とテキストに書いてありました。 割り込み発生時のプログラムカウンタやレジスタの値の退避先ってどこになるんでしょうか?

  • サービスルーチンの実行の流れ

    (c)ある処理を実行中に割込が発生してから、対応するサービスルーチンを実行し、元の処理に復帰するまでの一般的な処理の流れを説明せよ。 (1)プログラムの実行 (2)割り込み要求 (3)状態の退避 プロセッサは入出力装置の応答を待たずに実行中のプログラムをいったん停止して、他のプログラムを実行する。 (4)割り込み処理 元のプログラムに入出力動作が指定されると、OSに処理を依頼する。OSは入出力動作を起動し、他のプログラムに制御を渡す。 (5)状態の復元 入出力装置からの動作完了割り込みがあったとき状態を復元 (6)プログラムの再開 OSは入出力処理を実行後、元のプログラムの実行を再開する。 と6段階のフローにして考えてみました。合っていますでしょうか?

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

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

  • PIC16F193X割り込み時の退避・復帰処理方法

    ICマイコンでの割り込み処理について、16F193Xの型番では割り込み発生時における退避・復帰が自動的に行われると認識しているのですが、下記型番では以前の様に wレジスタ、status,PCLATh等のレジスタを退避・復帰をプログラムで保存しておく必要がなくなったということでしょうか? 使う割り込みはタイマー割り込み(timer0)とし、割り込処理中の割り込みは禁止とした場合 因みに割り込みは以下の様に発生させ ////////////////////////// org   0 goto start org 4 goto INTLAP ////////////////////////// INTLAP BCF INTCON,2 INCF TES_CNT,1 RETFIE 割り込み処理中にTES_CONのレジスタ内容をPORTAの出力pinをオシロスコープで観察できる簡単なプログラムで走らせると動作していることが確認できましたが、退避・復帰が行われているかは不明です。 他に自動退避・復帰を確実に実行するためのプログラム等の操作を怠っていないでしょうか? 初心者で認識が誤っていないのか判断が出来ません。 対象型番 PIC16F1933 ? PIC16F1934? PIC16F1936 ? PIC16F1937? PIC16F1938 ? IC16F1939 PIC16F193X/LF193Xデータシート記述より(P71,72) 〇「このデータシートに記載されているデバイスRETFIE 命令では、割り込み前に実行していたアドレスをスタックから取得し、シャドウ レジスタから保存した内容を回復し、GIE ビットをセットすることによって、ISR から通常動作に復帰します。」 内容保存機能 〇「割り込み動作に遷移する際、復帰時の PC アドレス値がスタックに保存されます。また、次に示すレジスタ値も自動的にシャドウ レジスタに保存されます。 ・W レジスタ ・ ステータス レジスタ (TO および PD を除く) ・BSR レジスタ ・FSR レジスタ ・ PCLATH レジスタ 割り込みサービス ルーチンから通常動作に戻るとき、自動的にこれらのレジスタ値が回復されます。 とあります。

  • 割り込みベクタの機能と実現方法

    (d)割込ベクタの機能と実現方式を説明せよ。 (1)機能 割り込みには、ハードウェア割り込み、ソフトウェア割り込みがあるが、割り込みベクタによって、どのような割り込みが発生したかが分かるようになっている。割り込みの発生要因によって、実行される処理(割り込みハンドラーと呼ばれたりサービスルーチンと言われる)はシステムによって決められている。 (2)実現方法 ベクタテーブルを作成する必要がある。以下それについて具体的に説明する。 多数の割り込み要因がある場合,それぞれに対応する割り込みサービス・ルーチンを作っておく必要がある.そして,割り込み要求信号が発生したときには,要求を出している要因に応じて,正しい割り込みサービス・ルーチンを呼び出さなければならない.そのために用いられるのが割り込みベクタ・テーブルである.それぞれの割り込み要因は,割り込みが受け付けられると,割り込み元を示す番号(割り込みベクタ)を送信する.メモリの中には,この番号と割り込みサービス・ルーチンの先頭アドレス(あるいはそのアドレスへの分岐命令)を対応付けた表(テーブル)を用意しておく.この対応表を,割り込みベクタ・テーブルと呼ぶ.  割り込みは元のソフトウェアの実行を強制的に中断してしまう.このため,特に中断されたくない処理を実行している場合には,その間だけ割り込みを禁止にする機能がある.  また,割り込み要因の中には,割り込み要求を常時有効にしたい要因もあるが,特定の局面でだけ有効にしたい要因もある.そのため,各割り込み要因ごとに,割り込みの受付を無効にする割り込みマスクの機能がある.割り込みマスクで無効にできる割り込みはマスカブル割り込み,割り込みマスクで無効にできない割り込みをノン・マスカブル割り込み(NMI)と呼ぶ.  特に緊急性が高い割り込みにはNMIを用いる. いかがでしょうか? 実現方法のところが答えられていますでしょうか?

  • 情報処理の問題ですが

    情報処理の問題ですがどなたか解き方を教えて頂けますでしょうか? 宜しくお願い致します。 問題 8000万個の命令を実行するプログラムを60MIPSで実行した場合に 予想される処理時間は何秒か(小数点第3位を四捨五入する) ここで プロセッサの使用率は75%としてオペレーティングシステムのオーバーヘッドは考えないものとする。なお、次の計算式を参考にするとよい (1)1秒間に実行できる命令数=MIPS値×使用率 (2)プログラム処理時間=プログラム命令数/1秒間に実行できる命令数 (3)MIPS値=1秒間に実行できる命令数を百万の単位で示したもの

  • プログラム内で処理中断後も継続処理を行うには?

    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
  • グループ化された中での複雑な処理

    いつもお世話になっております。 SQL初心者です。 このような、問い合わせをすることは可能でしょうか? テーブル名:TEST  NO:整数型  処理名:文字列型  処理状況コード:文字列型  処理状況名:文字列型 というようなテーブルで以下のようなデータが格納されている場合に、 NO、処理名、処理状況コード、処理状況名 ――――――――――――――――――――― 001、処理1、001、完了 002、処理1、001、完了 003、処理1、001、完了 004、処理2、001、完了 005、処理2、002、中断 006、処理2、002、中断 007、処理3、001、完了 008、処理3、002、中断 009、処理3、002、中断 010、処理3、003、実行中 011、処理4、000、未処理 012、処理4、000、未処理 処理名ごとに集計し、 (1)処理状況が全て「完了」=>「完了」 (2)処理状況が全て「未処理」=>「未処理」 (3)処理状況に「実行中」ひとつでも含まれていた場合=>「実行中」 (4)処理状況に「中断」が含まれているが「実行中」は含まれていない場合=>「中断」 ((4)は、(1)~(3)以外の場合と同意味) としたいのです。 <目的の抽出結果> 処理名、処理状況コード、処理状況名 ―――――――――――――――――― 処理1、001、完了 処理2、002、中断 処理3、003、実行中 処理4、000、未処理 SQL文一発で抽出することはきびしいのでしょうか? DBはORACLEです。

  • H8Sで割り込み発生時の飛び先アドレスがRAM上にある場合の割り込み関数の記述方法

    ルネサスのマイコンH8Sのプログラムを組んでおります。 プログラムの構成がBoot部分とアプリケーション部分に分かれており、 Bootはアドレス0番地から、アプリは3000番地以降の領域を使用するようになっています。 完成されたBootを使用してアプリケーションのプログラムを組まなければならなく、また、Bootは変更できないことになっています。 このBootの中のベクターテーブル上で、割り込みが発生した場合の飛び先のアドレスがRAM上になるように設定してあります。 このため、アプリケーションソフトでは、 割り込みが発生した場合のRAM上の飛び先に FLASH ROM上の指定したアドレスにジャンプする命令を書き、 FLASH ROMのジャンプ先には、実行したい関数を書きたいのですが、 (1)RAM上の特定のアドレスからFLASH ROM上の指定したアドレスにジャンプさせる方法。 (2)FLAH ROM上の指定したアドレスに関数を記述する方法。 を知りたいのですが、 どなたか教えて頂けないでしょうか? 開発環境はHew4 言語はC言語を使用しております。 私自身が理解不足であるため質問内容が伝わりにくいかと思いますが、 宜しくお願い致します。

  • 複数の割込み処理からアクセス可能なリングバッファ

    複数の割込み処理からのデータ追加(挿入)が可能なリングバッファを探しています。 例えば2本の不定期な割込みが発生し、それぞれの割込み処理ルーチンが一つのリングバッファにデータを挿入していくとします。 この時に挿入ポインタや挿入データをお互いに壊さないよう、排他制御されたリングバッファのソースをご存知でしたらお教え下さい。 言語はCまたはC++。 ライブラリなどを使わず、全てのコードを書くことが前提です。 CPUはなんでも構いません(割込禁止・許可などの命令は適宜置き換えます)。 よろしくお願いいたします。