問題タブ [interrupt-handling]
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.
embedded - STM32 デバイスで予期しないリセットをデバッグするにはどうすればよいですか?
STM32F107 チップを使用して C で開発を行っていますが、ある時点で、特定の関数を呼び出すとデバイスがリセットされ始めました。私はデバッガーを持っておらず、デバッグはシリアル ポート経由のプレーン テキストのみです。
レジスタにアクセスしてリセットの原因を確認できる他のマイクロコントローラをいくつか使用しましたが、このデバイスに相当するものが見つからないようです。Cortex-M3 のハードウェア例外は認識していますが、これらのハンドラー内にいるときは usart 経由でテキストを送信できないように見えるため (おそらく私の TX関数は割り込みを使用しますか?)。
そこで、このデバイスで私よりも経験豊富な人に尋ねることにしました: 通常、このような状況をデバッグするために何が行われますか?
編集
開発者の 1 人が WWDG ウォッチドッグをアクティブにし、障害ハンドラーから情報を取得する前にハードウェアをリセットしていました。間違った場所を指しているポインターによって関数を呼び出すことによるハード フォールトでした。ただし、ハード フォールト (@dwelch のアイデア) に保存されているレジスタから C コードを参照するための詳細 (またはそれに関する資料) を誰かが提供してくれることを期待して、この質問を続けます。
arm - 割り込みベクタ テーブルの設定、ARMv6
ARMv6 ベア メタル アプリケーションでユーザー モードと SVC を使用しようとしていますが、そのためには、ARMv6 割り込みベクトル テーブルの SVC エントリを設定して、割り込みハンドラに分岐する必要があります。しかし、これを行う方法の良い例を見つけることができません (つまり、どのメモリアドレスを正確に設定する必要があるのか、何に設定する必要があるのか)。私は過去に同様のことをしましたが、常により包括的なブートローダー (RedBoot) を使用して、これらの一部をセットアップしました。どんな助けでも大歓迎です。
以下を使用してアプリケーションをテストしています。
arm - ARM例外ベクトルを再配置しますか?
ARM例外ベクトルをどのように再配置しますか?
基本的に、ある方法でそれらを再マップできる必要があるため、ARMコアがベクターを実行しようとすると、にあるROMではなく、カーネルのRAMビットに格納されているカスタム例外ベクターを実行する必要があります0x0
。それは可能ですか?それとも、 ROMからカーネルに割り込みをルーティングするつもりですか?
つまり、基本的に、ARMコアに「ベクターテーブルの新しいアドレスはここにあります」と伝える方法はありますか?CPUを高ベクトルモードで起動できることは知っていますが、それは私が探しているものではありません。ベクターベースをカスタムアドレスに動的に設定できる必要があります。
linux - x86アーキテクチャ用のLinuxカーネルでの割り込み処理コードの場所
私は、割り込み処理を実装するLinuxカーネルのコードを見つけようと研究しています。特に、システムタイマーの処理を担当するコードを見つけようとしています。
http://www.linux-tutorial.info/modules.php?name=MContent&pageid=86によると
カーネルは、例外を処理する方法と非常によく似た方法で割り込みを処理します。すべての汎用レジスタがシステムスタックにプッシュされ、共通の割り込みハンドラが呼び出されます。>現在の割り込み優先度が保存され、新しい優先度がロードされます。これにより、優先度の低いレベルでの割り込みが、この割り込みを処理している間、カーネルに割り込みが発生するのを防ぎます。次に、実際の割り込みハンドラが呼び出されます。
スタック上のすべての汎用レジスタをプッシュするコードと、一般的な割り込み処理コードを探しています。
少なくとも汎用レジスタをスタックにプッシュすることはアーキテクチャに依存しないため、x86アーキテクチャに関連付けられているコードを探しています。現時点では、カーネルソースのバージョン3.0.4を見ていますが、どのバージョンでもおそらく問題ありません。kernel / irq / handle.cを調べ始めましたが、レジスタを保存しているように見えるものは何もありません。登録された割り込みハンドラを呼び出しているように見えます。
linux - Linux ISR エントリ ポイントの場所
Linux カーネルでのシステム コール インターフェイスと実装を理解しようとしています。ヘッダーと実装entry.S
の関係について知っています。libc
私が知りたいのは、カーネル内でint 80h
最初に受信された場所、つまり、実際には 80 時間の割り込みであると判断する場所です。だれか、これの LXR リンクを教えてもらえますか?
operating-system - 割り込みから戻る場所
割り込み処理について読んだ(そして勉強した)。
私がいつも理解していないのは、割り込みハンドラーから(PC / IP)に戻る場所をどのように知るかです。
私が理解しているように:
- 割り込みはデバイス(キーボードなど)によって引き起こされます
- 関連するハンドラーは、実行中のプロセスの下で呼び出されます。つまり、OSへのコンテキストスイッチは実行されません。
- 割り込みハンドラーが終了し、実行中のアプリケーションに制御を戻します。
上記のプロセスは、割り込み処理についての私の理解であり、現在実行中のプロセスのコンテキスト内で実行されます。つまり、コンテキストスイッチではなく、メソッド呼び出しに似ています。
ただし、実際には割り込みハンドラーに対してCALLを実行しなかったため、現在のIPをスタックにプッシュする機会がありませんでした。
では、割り込みからジャンプして戻る場所をどのようにして知ることができますか。よくわかりません。
この質問に具体的に対処する優れたpdf/pptを単に指し示すワンライナーを含め、説明をいただければ幸いです。
[私は一般的にLinuxとCコードの下で上記のプロセスを参照していますが、すべての良い答えを歓迎します]
linux - NMI を処理できないのはなぜですか?
NMI を処理し、NMI が発生したときに何かをしたい。まず、単純な nmi ハンドラを作成します。
モジュールを作成して nmi ハンドラーを登録し、APIC を使用して NMI を 5 回トリガーします。
ここで、「insmod xxx.ko」と入力してこのモジュールをインストールし、その後、/var/log/syslog を確認します。
nmi_handler の登録に成功(result=0)し、NMI が 5 回トリガーされましたが、nmi_handler に出力すべき文字列が見つかりませんでした。私は Ubuntu 10.04 LTS、Intel Pentium 4 デュアルコアで作業しています。
- NMI ハンドラが実行されなかったということですか?
- Linux で NMI を処理するにはどうすればよいですか?
embedded - stm32f4のI2Cスレーブレシーバー
stm32f4にi2cスレーブレシーバー割り込みサービスルーチンを実装しようとしています。これが私のスマートなコードです。
}
割り込みが呼び出され、I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHEDケースに入ります。現在、SCLは低くなっています。リファレンスマニュアルには、アドレスフラグをクリアすると、クロックが続行され、データが送信されると記載されています(ページ579-スレーブレシーバー)。私の意見では、データが到着すると割り込みが常に呼び出され、次の状態はI2C_EVENT_SLAVE_BYTE_RECEIVEDになります。
stmまたはgoogle経由で例を見つけることができません。誰かが私を助けたり、例を見せてくれますか?
c - C で行われた IDT が機能しない
特にキーボードのキーを押したときにキーボード関連の割り込みルーチンが呼び出されないため、IDT を機能させることができません。IDT テーブルの特別な 48 ビット ポインターのアドレスを渡しています。みたいにやってます
また、少なくとも GDT が機能しているかどうかもわかりません。
1) IDT を機能させるにはどうすればよいですか。私もいくつかのチュートリアルを見ましたが、役に立ちませんでした 2) GDT が正しく動作しているかどうかを確認するにはどうすればよいですか?
前もって感謝します。
編集:私は自分のOSのためにこれをやっています。アセンブリ ルーチンがポインタのアドレスを正しく受け取ることができるかどうか疑問です。そのため、インラインアセンブリを使用してLidtも実行しようとしましたが、役に立ちませんでした。何が悪いのかわかりません。手がかり、アイデアはありますか?
}
}