問題タブ [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.
embedded - RTOS - キュー内の異なるデータで保留中
TI のボードをプログラミングしていますが、2 つの異なる ISR の投稿をタスクのメッセージ キューに送信できるようにしたいと考えています。その部分はうまく機能します。ただし、受信側で、タスクがキューに保留され、ポストされた ISR に基づいてデータに対して別の操作を実行するためのインテリジェントな方法はありますか?
基本的に、モーターからの情報を表示する LCD 更新タスクがあります。しかし、モーター センサー ISR とボタン プレス ISR が異なる情報を送信して更新される場合、これを 1 つのキューで実行できますか?
assembly - 割り込みを無効にするとどうなりますか? また、処理方法がわからない割り込みはどうしますか?
(x86 の命令で) 割り込みを無効にすると、cli
正確にはどうなりますか?
PIC はユーザーが割り込みをオンにするのを待ち、それが発生したときに割り込みを発生させますか? (もしそうなら、それはどのくらい待ちますか?時間が「期限切れ」になったらどうなりますか?)
デバイスの観点からすると、割り込みは応答なしで「ブラック ホール」に送信されますか?
PICはどういうわけか「CPUがビジーです」などとデバイスに伝えますか?
それとも何か他のことが起こりますか?
また、処理方法がわからない割り込みをどのように処理しますか?
PIC (またはデバイスがわからない場合はデバイス) に「はい、メッセージを受け取りましたが、どうすればよいかわかりません」と伝える方法はありますか?
c - 32 ビット Open Watcom C での FAR ジャンプ命令の生成
別の ISR (Interrupt Service Routine) にジャンプするには、far jump 命令を生成する必要があります。私は 32 ビットの FreeDOS アプリケーションを開発しています。
OW のマニュアル ( cguide.pdfおよびclr.pdf ) を読んだ後、警告やエラーなしで正常にコンパイルされる 2 つの方法を見つけました。
私が考え出した他のアプローチは次のとおりです。
さて、私の質問は、上記の 2 つの方法のどちらがより正しいか、または優れているかということです。アイデアや意見はありますか?
これを達成する他の方法はありますか?
dos - フラットメモリモードのHW割り込みをDOS32/Aに置き換えます
フラットメモリモードでHW割り込みを置き換える方法について質問があります...
- 私のアプリケーションについて...
- WatcomCとDOS32/Aを組み合わせて作成されました。
- DOSモードで実行するために作成されました(OSモードではありません)
- DOS32 / Aを使用すると、100万を超えるメモリにアクセスし、使用する大容量メモリを割り当てることができます...(フラットメモリモードで実行中!!!)
- 現在の問題...
- 1枚のPCIカードにISR(割り込みサービスルーチン)を書きたい。したがって、HW割り込みを「置き換える」必要があります。
- 元。PCIカードの割り込みライン=0DOSでは0xE。これは、このデバイスが8259のIRQ14を介して割り込みを発行することを意味します。
しかし、フラットモードでこの割り込みを置き換えるという目標を達成する方法はありませんでしたか?
@リソースを見つけました...-watcomCのライブラリには、_dos_getvect、_dos_setvect、および_chain_intrを使用してINT0x1Cをフックするサンプルが1つあります...このコードをテストしてOKでした。しかし、それを私の場合に適用すると、INT76(IRQ14は"INT 0x76" <-(14-8)+ 0x70)で、何も起こりませんでした。
- HW割り込みが生成されていることを確認しましたが、自分のISRが呼び出されませんでした...
私は何かを失いますか?または、目標を達成するために使用できる機能はありますか?
================================================== =============
[20120809] DPMI呼び出し0x204および0x205 を使用しようとしましたが、 MyISR()がまだ呼び出されていないことがわかりました。私がしたことを以下に説明しました。多分あなた方全員が私にいくつかの提案をすることができます!
1)インラインアセンブリを使用してDPMI呼び出し0x204および0x205を実装し、OKをテストします...
元。DPMI 0x204を使用して16個のIRQの割り込みベクトルを表示すると、次の結果が得られます( selector:offset ): 8:1540(INT8)、8:1544(INT9)、.....、8:1560(INT70)、8 :1564(INT71)、...、8:157C(INT77)
元。DPMI 0x205を使用してIRQ14 (INT76)の割り込みベクトルを設定し、CF = 0を返し、成功したことを示します
2)次のように独自のISR MyISR()を作成します。
3) DPMI呼び出し0x205によって新しい割り込みベクトルを設定します。
次に、sts = 0(CF = 0)は成功したことを示します!
- ここで奇妙なことの1つは、私のアプリはフラットメモリモデルで実行され、MyISR()のセレクターは0である必要があると思います...しかし、DPMI呼び出し0x205のセレクター= 0の場合、CF=1およびAX=0x8022を取得し、「無効なセレクター」!
4) HW割り込みを生成し、証拠は次のとおりです。
- PCIデバイス構成レジスタ0x5ビット2(割り込み無効)= 0
- PCIデバイス構成レジスタ0x6ビット3(割り込みステータス)= 1
- PCIデバイス構成レジスタ0x3C/0x3D(割り込みライン)= 0xE / 0x2
- DOSでは、割り込みモードはPICモード(8259モード)およびピンベース(MSIE = 0)です。
5)ティックの値を表示し、それがまだ「0」であることを確認しました...
したがって、MyISR()が正しく呼び出されていないと思います...
c - ISR、sprintf()、printk()、その他にログインしますか?
ISRをログに記録/デバッグしようとすると、次のことがわかりました。
1)sprintf()
「O」ReillyLinuxデバイスドライバーの例として使用
printf()とは異なり、sprintf()はコンソールではなくメモリに書き込み、再入可能またはブロッキングの問題はないようですが、正しいですか?しかし、私は他のフォーラムでsprintf()に反対する言葉を見てきました。パフォーマンスのオーバーヘッドだけが原因なのか、それともそうでないのかわかりません。
2)printk()
人々が使用しているのを見たが、これもパフォーマンスの問題であると非難されたもう1つの問題です(おそらく他に何もありませんか?)
最近のLinuxでISRをログに記録したり、デバッグしたりするときに使用する一般的に適切な方法/関数は何ですか?
interrupt - 静的に定義されたIDT
起動時間の要件が厳しいプロジェクトに取り組んでいます。対象となるアーキテクチャは、32ビットプロテクトモードで動作するIA-32ベースのプロセッサです。改善できると特定された領域の1つは、現在のシステムがプロセッサのIDT(割り込み記述子テーブル)を動的に初期化することです。プラグアンドプレイデバイスがなく、システムが比較的静的であるため、静的に構築されたIDTを使用できるようにしたいと思います。
ただし、8バイトの割り込みゲート記述子がISRアドレスを分割するため、これはIA-32アーチにとって厄介であることがわかります。ISRの下位16ビットは記述子の最初の2バイトに表示され、他のいくつかのビットは次の4バイトを埋め、最後にISRの最後の16ビットが最後の2バイトに表示されます。
const配列を使用してIDTを定義し、IDTレジスタを次のようにポイントするだけです。
等
myIsrは一定ではないため、Cでこれを行うことは違法であるため、明らかにこれは機能しません。その値は、コンパイラではなく、リンカ(限られた量の計算しか実行できない)によって解決されます。
これを行う方法に関する推奨事項やその他のアイデアはありますか?
ありがとう、
linux - 信号と割り込みの比較
さまざまな参考資料に基づいて、Linuxでのシグナルの主観的な定義は、「特定のイベントの発生についてプロセスに通知するために使用されるトリガーです。ここでのイベントはソフトウェア例外を指す場合があります。さらに、シグナルはIPCメカニズムにも使用される場合があります。 「」私が持っている質問は
- 例外(ソフトウェア割り込み)のみが信号で通知されると思いますが、ハードウェア割り込みの場合はどうでしょうか。
- 信号のさまざまなソースは何ですか?私には、カーネルが常にシグナルのソースであるように見えます(IPCに使用される場合を除く)
- シグナルハンドラとISRの違いは?
- 信号ブロッキングと割り込みマスキングの違いは?
c - カスタム ISR を使用した c のレジスタによる単純な算術演算
私は独自の ISR を作成し、AH を 1 に設定すると BX および CX レジスタを追加する必要があるなどの基本的な演算を実行する必要があるプログラムを作成しています。AH が 2 に設定されている場合、BX および CX レジスタで減算を行う必要があります。
私の問題は、生成された結果が正確でないことです。私のコードは以下の通りです:
linux-kernel - Linux IRQ: ISR 内の IRQ のマスク解除
を使用している IRQ がありhandle_level_irq()
ます。ほとんどの場合、ISR は下位半分をスケジュールする必要がありますが、場合によっては、それが偽であると判断でき、(パフォーマンス上の理由から) 下位半分をスケジュールしたくない場合があります。問題は、後者の場合、競合状態が発生することです。ISR がスプリアスであると判断した場合、割り込みのマスクを解除し、終了する準備をします (desc->lock
この時点では、ISR は によって保護されていないことに注意してください)。handle_level_irq()
しかし、その後、2 番目の CPU で割り込みがトリガーされます。2 番目の CPU は、グラブに従ってdesc->lock
IRQ をマスクし、1 番目の CPU で ISR が進行中であると判断するため、ロックを解除desc->lock
して終了します。最初の CPU の元の ISR も終了し、割り込みは常にマスクされたままになります。
必要がない限り、下半分をスケジュールできないようにしたいので、上記の競合状態を回避しながら、ISR がマスクを解除する方法はありますか?
deadlock - 小さな組み込みシステム上のIRQのスピンロック
オペレーティングシステムを使用せずに、ARMマイクロコントローラ上に小さな組み込みシステムを開発しています。いくつかの異なるタイプの割り込みが発生し(ボタンの押下、AからDへの変換、タイマーなど)、単一のスレッドが実行されます。
処理するイベントのFIFOキューが必要です。ここで、各割り込みサービスルーチンはそのイベントをキューに追加し、メイン(および唯一の)スレッドはイベントをキューから削除して処理します。割り込みサービスルーチンでキューデータ構造に明らかにアクセスすることは危険ですが、メインスレッドにロックがあり、割り込みが発生した場合、ISRはロックを永久に待機するため、スピンロックによってデッドロックが発生します。
もちろん、メインスレッドがキューをいじっている間は割り込みを無効にできることはすでに知っていますが、これは理想的ではありません。
ここに進むための最良の方法は何ですか?
ありがとうA