問題タブ [irq]
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.
linux - request_irq は成功するが、割り込みが検出されない
ARM プロセッサで組み込み Linux 3.2.6 を実行しています。デバイスの 4 つの USART ポートを制御するために、atmel のシリアル ドライバーの修正版を使用しています。カーネルでコンパイルされたドライバーを使用すると、すべて正常に動作します。しかし、代わりにドライバーをカーネルモジュールとして実行したいと考えています。必要な変更をすべて行い、内部ドライバーを無効にしましたが、すべて問題ないようです。4 つの tty デバイスが正常に登録され、すべてのプローブおよび初期化機能が正しく機能していることがわかります。
問題は次のとおりです。いずれかのデバイスに書き込もうとすると、「送信開始」関数が呼び出されますが、usart からの割り込みが発生するのを待ちます。そのため、書き込みがハングするだけで、ロジック アナライザーを使用すると、RTS がアサートされていることがわかりますが、tx ラインにバイトは表示されません。request_irq の呼び出しが成功することはわかっていますが、/proc/interrupts に irq エントリがまったく表示されません。ドライバーでは、request_irq を使用して、gpio ライン用の別の割り込みハンドラーを登録することも試みましたが、これは正常に機能します。
これはおそらく診断が難しい問題であることはわかっていますが、解決策を見つけるための正しい方向に導く可能性のある提案を探しています。説明が必要な場合はお知らせください。ありがとうございました
linux - ISRの最後にARMがIPIを処理する理由
LinuxでのIRQ処理を勉強しています。各ISR[forSMP]の最後でIPIを処理する必要がある理由について質問があります。IPIに何か特別なものはありますか?do_asm_IRQで他の割り込みを処理してみませんか。
任意の提案をいただければ幸いです。
http://lxr.oss.org.cn/source/arch/arm/include/asm/entry-macro-multi.S?v=3.5.2;a=arm
linux - Linux ですべての ksoftirqds を有効にする方法は? (Linuxカーネルのネットスタックについて)
4 コアの Intel マシンにマルチキュー NIC カードがあり、NIC カードのすべてのキューを CPU コアにバインドします (set /proc/irq/xxx/smp_affinity)。core0 に queue0、core1 に queue1 などとします。
ハードウェア割り込みが発生したのと同じコアで softirq が呼び出されると言われています。私のマシンで ksoftirqd を並列実行できないのはなぜですか? コアの 100% を使用するのは 1 つのカーネル スレッド (ksoftirqd/2 など) だけですが、他のスレッドは 0% です。
私が使うとき
すべてのパッケージがすべての NIC キューに配布されていることがわかります。
アップデート:
中国語http://hi.baidu.com/higkoo/item/42ba6c353bc8aed76d15e9c3を読める場合の 100% softirq 問題の解決策は次のとおりです (#7 を参照してください)。この問題は解決されるでしょう
timer - タイマー割り込みを一時的に無効にする
stm32f4xx uC で C の組み込みプロジェクトに取り組んでいます。
ループ操作 XYZ を連続して実行するコードの一部があり、時々 TIM4 割り込みがいくつかのグローバル パラメータを変更し、操作 XYZ を再開させます。
コードは次のようなものです。
XYZ は、バッファとその他の間のデータ転送を含む複雑な操作です。
TIM4 割り込みハンドラはこれを行います: XYZ を停止し、XYZ 操作に影響するいくつかのグローバルを変更します。
したがって、基本的には、XYZ を繰り返し実行し、TIM4 割り込みで XYZ を停止し、パラメータを変更してから、新しいグローバル パラメータで XYZ を再起動してループを再開する必要があります。
問題: XYZ には多くの命令があるため、TIM4 IRQ がその途中で発生する可能性があり、IRQHandler がグローバルを変更した後、XYZ の途中から操作が再開され、プログラムが台無しになります。
私の最初の解決策: __disable_irq() で行 A の割り込みを無効にし、__enable_irq() で行 B でそれらを復元します。
XYZ 複合操作は他の割り込み (TIM4 以外) を使用する必要があるため、失敗します。
次の解決策 次のコマンドを使用して、ライン A の TIM4 割り込みのみを無効にします。
次のコマンドを使用して、B行で有効に戻します。
割り込みを失っているため失敗します。int が復元されると、XYZ 中に到着した割り込みは無視されます。これは大きな問題です (理由の 1 つは、TIM4 IRQHandler がグローバルを変更し、TIM4 を再度アクティブにして後で割り込みを発生させることです。割り込み間の期間が異なるため、私はこれを行います)。
誰でもこの問題の解決策を教えてもらえますか? TIM4 IRQ を無効化/復元し、割り込みを失わないようにするより良い方法はありますか?
assembly - LPC238 (Crossworks + GCC) で IRQ が正しく動作しない
現在、Crossworks ARM (2.1) を使用していますが、LPC2368 MCU の割り込みに問題があります。
アクションの 2 つのコース (UART の例):
1) 働くもの:
- uart の初期化と IRQ の実装全体は main.c ファイルにあります。
- Crossworks で必要とされるため、コードは VECTORED_IRQ_INTERRUPTS フラグを使用してビルドされます
- すべて正常に動作します (エコー テスターは応答しています)
- IRQ cpu を終了した後、モードをスーパーバイザーに変更しています (ビルド フラグも設定されていました)。これはクールで機能しています。
2) 動作していないもの:
- cpu は、main.c 以外のディレクトリ ((ProjDir)/SystemCtrl/) の別のファイルにあるルーチンによって初期化されます。
- uart init 関数は、ネストされたディレクトリ ((ProjDir)/SystemCtrl/LPC/libuart) に設定されます。
- 起動後はすべて問題ありません。ボーレートは問題なく、UART は正しく初期化されています
最初の悪い点: データが最初に受信されると、IRQ が適切に呼び出されます。ただし、受信データは異なります (つまり、送信: 0x31、受信: 0x82)。
2 つ目の悪い点: 間違ったデータが受信された場合でも、echo は PC に異なる値を送信します! (つまり、送信: 0x31、受信: 0x82、エコー送信: 0xFE)
3 つ目の悪い点: IRQ が終了し、CPSR の IRQ モードがまだ設定されている! I フラグはクリアされません。IRQ には属性((interrupt(IRQ))) があります。そして、まだ正しく動作していません。
誰にもアイデアはありますか?何が悪いのかわかりません。スタックサイズも変更しました(奇妙なスペースで何らかの形で失われたのではないかと思いました)。ディレクトリをネストすると、どのようにすべてが壊れますか? 設定を変更せずにクリーンプロジェクトでもテストされました。
embedded - FIQ と IRQ を組み合わせて使用すると、カーネルがフリーズします。なぜですか?
3 つの割り込みが有効、1 つの UART から IRQ (シリアル ポート)、Timer1 から IRQ (ちらつき LED を制御)、Timer0 から FIQ (出力ステッピング信号の生成)。
最初の FIQ ハンドラは空です:
IRQ ハンドラ:
上記のコードは問題なく動作し、LED の点滅、UART 応答、およびその他の機能も良好です。しかし、FIQ ハンドラーにいくつかのコードを追加した後、主にカウンター (uint16) を設定し、IO を高/低にします。
CPU は起動後数秒 (~2 秒) にロックアップし、その後 LED の点滅が停止し、UART が応答しなくなります。変数 cts も最初は 0 に設定されています (したがって、if() は入力できません)。
私は最初に、timer0 の設定が速すぎることが原因であると考えました (そのため、より多くの FIQ が一緒にスタックされ、クリアされることが少なくなります)。そこで、timer0 をあまり頻繁に設定しませんでした。そして..起動時に問題ないようです.LEDは点滅し続けます...しかし、シリアルポート(UART)を介していくつかの文字を送信すると、システムはすぐに再びロックされます. ---! どうしたの?
ここに書かなければならない重要な情報を見逃している場合は、お知らせください。
c - リアルタイム C プログラミング vicInstallHandler を理解するには助けが必要です
このコードをコメントよりもはるかに詳細に理解する必要があります。
linux-kernel - 共有割り込みラインの場合、使用する割り込みハンドラーを見つけるにはどうすればよいですか?
共有割り込みラインの場合、複数の割り込みハンドラーを持つことができます。カーネルは、その特定の共有回線のすべてのハンドラーを順番に呼び出します。私の知る限り、各ハンドラーは、呼び出されると、呼び出される正しいハンドラーであるかどうかをカーネルに通知します。
私の質問は、これがどのように決定されるか、特定のデバイスのステータスを通知するメモリマップドレジスタをチェックする方法はありますか、それとも他のハードウェアメカニズムがありますか?対応するデバイスが実際に割り込みを発行したデバイスであるかどうかをハンドラーはどのようにして知るのでしょうか。
この情報は、デバイスとプロセッサの割り込みラインの間にある割り込みコントローラを介して中継されますか?
linux - Arm Cortex A9 で割り込みを処理するために、Linux カーネルはいくつの命令を必要としますか?
ARM
cortex A9
1つのコアが IRQ を処理するのに必要なオペコードの量を見積もりたいと思います。
私が Linux カーネルで作業していると仮定すると、 を呼び出して実行するのに必要な3.4
オペコードはいくつですか?irq
irq_handler
linux-kernel - in_irq() は信頼できますか?
Unreliable Guide To Hacking The Linux Kernelは次のように述べています。
in_irq() が true を返すため、ハードウェア割り込み中であることがわかります。
注意。割り込みが無効になっている場合、これは誤検知を返すことに注意してください (以下を参照)。
in_irq()
x86 の Linux カーネル 2.6.32 以降では、hardirq コンテキストでゼロ以外を返す可能性があるのは本当ですか?
カーネル 2.6.32 (Debian 6) および 3.4 (OpenSUSE 12.1) での私の実験では、プロセス コンテキストから呼び出された場合、 と の間でin_irq()
呼び出された場合でも常に 0 を返しました。の代わりに割り込みを無効にするスピンロック関数を使用した場合、結果は同じでした。local_irq_disable()
local_irq_enable()
local_irq*
in_irq()
カーネルのソース コードから、どのように偽陽性を返すことができるのか、現在のところわかりません。誰でもこれを明確にできますか?
編集:私はまた、スピンロック API と / の両方を試しまし*_irqsave()
た*_irq()
がlocal_irq_save()
、local_irq_restore()
結果は同じでした。つまりin_irq()
、割り込みが無効になっているときに 0 が返されました。x86 でマシン命令を介して明示的に割り込みを無効にしてcli
も、in_irq() がゼロ以外を返すことはありませんでした。