問題タブ [isr]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
assembly - ISR の後、プログラムは同じ行に戻り続けます。(アセンブリ 8086)
私は割り込みを扱っていますが、コードの実行中にこの問題に直面しています:
プログラムが IRET 命令から ISR (ここでは INT_PROC) から戻った後
次の行を実行しています:
それが行くはずだった間、何度も何度も:
同じことを言っているフォーラムでこれを見つけました:
割り込みハンドラを返した後、プログラムカウンタはどこに行きますか?
なぜそれが起こっているのですか?どうすれば解決できますか?助けてください。
c - 割り込みなどを介してループを非同期的に終了します (MSP430/C)
私が考えることができるすべてのソリューションには、完全に機能しない問題があるため、かなり困惑している問題に遭遇しました。私は MSP430FF529 でゲームに取り組んでおり、最初に電源を入れたときに、ループとサイクル遅延を使用して 2 つの画像が画面に無限に描画されます。ユーザーがスタートボタン(ポートの単純なハイエッジトリガー)を押すと、プロセスのどの部分に関係なく、プログラムがそれらの画面の描画をすぐに停止し、残りの実行を開始するようにしたいと思いますゲームを実行するコードの。
画像を画面に表示する関数を do while ループに入れることもできますが、描画中の現在の画像が移動する前に終了する必要があるため、非同期にはなりません。
私は break コマンドを使用しますが、それが ISR では機能せず、直接ループ内にある場合にのみ機能すると思います。
残りのプログラム全体をスタート ボタンを押すために使用する ISR に入れることで、基本的に画面描画が元に戻らないようにすることもできますが、それは本当に混乱し、コーディングが不十分であり、後で多くの問題を引き起こすことになります。
本質的には、ボタンが押されると、プログラムが実際のゲームであるプログラムの部分にすぐにジャンプし、それらの画像を画面に描画することを忘れるようにしたいと考えています。ルーチン内のコードが実行された後、現在起こっていたことに戻らない ISR を持つことは可能ですか? 基本的に、プログラムが前進し始めると (開始ボタンが押されます)、明示的に再度呼び出さない限り、画像を描画する関数に戻りたくありません。
私が考えることができる唯一のことは goto コマンドです。この特定の例では、実際にはそれほど悪くはないと思いますが、ほとんどの場合、貧弱な解決策であるため、習慣になることを恐れて使用を避けたいと思います. ただし、ISR で goto を使用すると実際にスタックが台無しになると感じているため、それも機能しない可能性があります。
何か案は?任意の提案をいただければ幸いです。
stack - ISR (Interrupt Service Routine) には別のスタックがありますか?
RTOS (ex FreeRTOS) を使用する場合、スレッドごとに個別のスタック スペースがあります。では、ISR (Interrupt Service Routines) はどうですか? メモリ内に別のスタックがあるのでしょうか? または、これは構成可能ですか?
ISR で宣言されたローカル変数が格納されるスタックがない場合はどうなりますか?
c - MSP430 割り込みオーバーヘッド
MSP430 の ISR を書いています。揮発性 PxIFG レジスタを読み取り、最初の命令でスタック変数にコピーします。ISR ジャンプのオーバーヘッドはありますか、または予想できますか
のようなものにコンパイルする
ISR ジャンプ後の最初の命令がレジスタ ロードである場合、ISR が意図したとおりに機能することはわかっています。私の理解では、MSP430 は、ジャンプ後に 1 つの命令を保証してから、再び中断することができます。ロードがジャンプ後の最初の命令でない場合、P4IFG レジスタが読み取られる前に再び中断される可能性があり、その値が別の値に変更される可能性があるという問題があります。
コンパイラがそのジャンプの直後にロード命令を配置して、別の割り込みが変更される前に常にそのレジスタのコピーを取得することを期待するのは合理的ですか?
ありがとうございました
c - グローバル変数を使用して ISR での実行をマークしても安全ですか?
CPU が現在 ISR で実行されているかどうかを開発者が検出できるようにするためのさまざまな方法 (レジスタの読み取りなど) は、さまざまなアーキテクチャで提供される可能性があることを私は知っています。
g_in_isr
しかし、一部の BSP コードでは、CPU が ISR で実行されているかどうかを示すフラグとしてと呼ばれるグローバル変数を使用していることがわかりました。割り込みが発生すると、割り込みハンドラはg_in_isr++
開始時と終了時に操作を実行g_in_isr--
します。
ネストされた割り込みを許可するアーキテクチャでこの方法が安全かどうか疑問に思っています。ほとんどのアーキテクチャでは、g_in_isr++
またはg_in_isr--
アトミック操作ではありません (そうですか?)、既存の割り込みハンドラーがg_in_isr++
操作を行っている間に優先度の高い割り込みが発生した場合はどうなりますか? それは問題を引き起こしませんか?
更新 (2016-03-27)
ええ、アーキテクチャに依存することは知っていますが、一般的なケースを知りたいです。それはアトミックではないと仮定しましょう。g_in_isr++
実際、ほとんどのアーキテクチャではアトミックではありません。もちろん、アトミックにするためにコンパイラの魔法も使用していません。
そのような場合、それは問題を引き起こすでしょうか?
linux-kernel - カーネル ドライバー ISR で遅延を使用する方法
カーネル ISR ルーチンに遅延を導入するために msleep や usleep などの関数を使用できないことは承知しています。
内部に特定の ISR が定義されているカーネル ドライバーがあります。ISR ブロックの 1 つで、ミリ秒単位の特定の遅延を挿入する必要があります。まあ言ってみれば:
次のようなものを使用できますか:
私のプロセッサが 1Gbps で実行されているとしましょう。上記の for ループは 1000 マイクロ秒、つまり 1 ミリ秒の遅延を与えますか?
embedded - Microchip Harmony Configurator (MHC) を使用して、PIC32MZ2048ECH144 の同じポートの 2 つのピンに ISR マクロを書き込む方法は?
PIC32MZ2048ECH144 を使用しています。RH8 (ピン番号 81) と RH9 (ピン番号 82) に接続された 2 つのスイッチがあります。ピン レベルで割り込みを設定するオプションが MHC に表示されないため、ポート H 用に生成された ISR を取得します。各ピンの ISR を個別に呼び出す必要があります。したがって、「system_init.c」の「SYS_Initialize」関数に次の行を追加しました。
PLIB_PORTS_PinChangeNoticePerPortEnable(PORTS_ID_0, PORT_CHANNEL_H, PORTS_BIT_POS_8); PLIB_PORTS_PinChangeNoticePerPortEnable(PORTS_ID_0, PORT_CHANNEL_H, PORTS_BIT_POS_9);
「system_interrupt.c」で MHC によって生成された ISR:
上記の ISR マクロを以下の行に置き換えました。
これはうまくいきませんでした。リンクhttp://microchip.wikidot.com/faq:78を参照しました。「/pic32mx/include/proc/p32mz2048ech144.h」から ISR マクロのベクター番号を選択するのは間違っていると思います。(私は _ADC1_DATA22_VECTOR と _ADC1_DATA23_VECTOR を使用し、81 と 82 に対する値はピン番号であると考えていましたが、これも機能しませんでした。) ピンレベルの割り込み (同じポートに 2 つのピン) を設定する方法に関するヘルプやヒントは本当に素晴らしいでしょう! 私の投稿に誤りがありましたことをお詫び申し上げます。
前もって感謝します。