
No.4ベストアンサー
- 回答日時:
(1)別ルーチンに飛ばすというのがサブルーチンを呼び出すという意味なら一般的には可能です。
ただしANo.3で書かれているように、一般にサブルーチンは再入可能であることが求められます。なお、使用レジスタの保存は割込み処理ルーチンに求められるもので、サブルーチンを呼ぶからというものではないと思います。
あと、一般的に割込みスタックはそれほど深くないので可能な入れ子段数には注意が必要です。まあ組込みなら普通のプログラムでも注意は必要ですが。
別ルーチンに行ったまま帰ってこないということなら、処理系によるでしょう。割込み終了システムコールを使うなら別ルーチンで終了ということもできると思います。
(2)割込み処理ルーチンからの復帰はどこでも可能ですが、returnで戻れるかは処理系によります。
OSによっては最後はシステムコール呼び出しになっている場合があります。その場合はreturnでなくシステムコール呼び出しが必要でしょう。
No.3
- 回答日時:
(1)割り込みルーチン中から別のルーチンに飛ばすことは可能でしょうか?
可能です。ただし、何点か注意が必要です。
a()が再入可能(リエントラント)なルーチンでないとトラブルになることが有ります。
再入可能出ない場合には、a()を実行中にa()を使用する割り込みが発生しないことを保障する必要があります。
a()で使用するレジスタが保存される必要があります。
一部のレジスタは自動的に保存されますが、保存されないレジスタが有る場合にはコンパイラに指示を出す必要があります。
どのレジスタが保存されるのか、どのように指示をするのかは環境異存なので開発環境のマニュアルを読んでください。
(2)割り込みルーチンの途中で最後まで処理を終えずに、割り込み先に復帰させることは可能でしょうか?
問題ありません。
No.2
- 回答日時:
割り込みと一口に言っても、ハード割り込みとソフト割り込みの二種類があって
前者の場合、ms単位で処理を完了しないといけません。
なんで、他の関数を呼び出すというのは、御法度です。
後者の場合、呼び出すことは可能ですが、
割り込み処理中にまた割り込みが発生するケースを考慮しなければなりません。
というわけで、経験的には、
割り込み処理では、発生したイベント(情報)自体をスタック管理しておいて
メインループにて手動で取り出してあげるというのが結構無難だったりします。
割り込みじゃないじゃんといわれてしまえばそれまでですが、
何をするにしてもプログラム的にある程度の区切りをつけておかないと
異常系の処理をするにしても都合が悪くなるのであんまり気にしたことはありません。
No.1
- 回答日時:
>(1)割り込みルーチン中から別のルーチンに飛ばすことは可能でしょうか?
駄目です。割り込みルーチンはCPUの動作の中でも特別なものです。割り込み実行を完遂させずにユーザー(アプリケーション)のルーチンに制御を移行させることは物理的に不可能なのです。
>(2)割り込みルーチンの途中で最後まで処理を終えずに、割り込み先に復帰させることは可能でしょうか?
上記に説明したように不可能です。とにかく割り込み処理は短時間に終了させるのがコツです。
ソフトウェアの設計として、割り込みを効率的に使用するであればOSが絶対必要です。OSの存在しないプログラミングとして
割り込みルーチンでフラグを立てて、後で参照する
というやり方がありますが、デバッグがとてつもなく難しくなります。
割り込み処理の一般的なコーディングは
割り込み
{
割り込み処理
if(割り込みの待ちプロセスはあるか?)
待ちプロセスの起動ルーチンの実行(wake up)
retuen
}
となります。
WindowsやLinuxのアプリケーションのプログラマなら良いのですが、組み込みシステムを設計するなら
最低限のOS(モニター)
を設計できないプログラマー(エンジニア)は3流以下です。駄目人間は決まって、CPUの実行速度が遅いだのメモリが足りないだの文句を吐きます。まともな設計ができない人ほどね。今までそんな駄目プログラマーの相手をしてどれほど時間を無駄にしたやら・・・
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
スーパーのレジで並んでいたら...
-
irqbalance って
-
pic 複数の割り込み関数 切り分...
-
C言語について(PWM)
-
PICマイコンでエンコーダパルス...
-
電車のドアの前での並び方
-
電車で待機列の割り込みについ...
-
Macターミナルで実行中のプログ...
-
powershell を使いカレントディ...
-
バックグラウンドのプロセスの...
-
パソコンの演算速度について
-
エクセルVBA 大容量CSVファイル...
-
VBSの処理中一旦処理を止めて再...
-
【C言語】再帰が時間がかかる...
-
子プロセスの状態を親プロセス...
-
keycodeについて
-
sendkeysにてALT+CTRL+INSERTを...
-
マイコンからプログラムを読み...
-
逆コンパイルと逆アセンブルの...
-
スレッドにて同一メモリの書き...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
電車で待機列の割り込みについ...
-
CPUの処理量を減らすコーデ...
-
スーパーのレジで並んでいたら...
-
このレジの並び方は間違ってま...
-
Amazonfireタブレットにわから...
-
CPU負荷率の安全な上限と計...
-
【組込み】割り込み中のstatic...
-
USJでの割り込み
-
VB6でSendKeyを利用したTab移動...
-
irqbalance って
-
インバウンドで迷惑している人...
-
VB.NET スレッドからのイベント...
-
デュアルCPUのパソコンでCPUを1...
-
Timerコンポーネントのインター...
-
C言語でPICマイコン開発
-
Arduinoのプログラムで質問です。
-
マイコンSH-2の割り込みを用い...
-
H8マイコンでの割り込み(シリ...
-
優先度順方式とプリエンプショ...
-
マイコン C言語 割り込み処理...
おすすめ情報