私はARM Cortex M4 MCUを使用しています。優先度2のGPIO用の割り込みハンドラと優先度3のSPIドライバ(つまりGPIOよりも優先度が低い)を持っていて、GPIOの割り込みハンドラ内から(ブロックする)SPIの読み込みを呼び出すと、SPI関数は動作しますか?ARM Cortex-M4割り込みの優先度
答えて
あなたの質問に対する答えは、転送を処理するためにどのようにブロックされているかによって異なります(@Notlikethat)。
SPIドライバがポーリングドライバの場合は、動作する可能性が高くなります。この場合、GPIO割り込みはSPIペリフェラル内のフラグで回転し、転送の各部分が完了するのを待ちます。
SPIドライバが割り込み駆動型である場合、動作しません。優先順位2割り込み(GPIO)を実行しているので、優先順位3割り込み(SPI)はGPIO割り込みが終了するまで実行されません。 SPIドライバの書き方によっては、システムが完全にハングしたり、タイムアウトになることがあります。
SPIドライバがDMA駆動の場合、答えはあまり明確ではなく、ドライバの仕組みによって異なります。この場合、トランザクションは完了する可能性がありますが、関数がDMA割り込みを待つのをブロックした場合、その優先度に応じて関数が到着しないことがあります。
上記のいずれの場合でも、割り込みの中でそのようなことを行うのは良い考えではないと一般的に考えられます。 RTOSを使用している場合は、セマフォを待っているSPIトランザクションを実行する優先度の高いタスクを使用するか、またはOSがサポートしている場合は、遅延割り込み処理を使用できます。 RTOSを使用していない場合は、優先度の低い割り込み(つまり、PendSVを最も低い優先度で使用する)を通知する方法や、メインプロセス内からフラグを監視する方法があるかどうかを検討します。より優先度の低い割り込みを使用すると、メインプロセスを(もし必要なら)プリエンプトできますが、ほかのすべての割り込みは実行を続行できます。メインプロセスのフラグを監視することができれば、割り込みを続行することもできますが、時間制限がある場合は可能です(アプリケーションの構造に応じて)
私が使用しているMCUは、RTOSなしのNordic nRF52です。私が抱える問題は、4msごとにデータが準備されているSPIセンサーがあり、各割り込みでSPIによって読み取られ、バッファーに格納されます。多数のサンプルが読み取られた後、データが処理されます。処理には10msかかる予定です。したがって、2つのサンプルが処理中に(ダブルバッファに)準備され、格納されることが期待されます。 RTOSがないので、私は何とか新しいデータ読み込み割り込みが処理ハンドラを先取りするようにする必要があります。 続き – tosa
私はSPIの読み込みをGPIO割り込みハンドラで直接実行させることを考えていました。そのため、データ処理関数はメインから(より低い優先度で)実行できます。これを解決する最も単純な(そして堅牢な)方法は何ですか?ありがとう! – tosa
あなたが私に与えた数字に基づいて、あなたが追いつくことができないように思えます。 4ミリ秒ごとに処理するには10ミリ秒かかる新しいデータがあります.1秒後に未処理の150サンプルのバックログがあります。処理はどのようなコンテキストで行われますか?それは割り込みの1つにあるのですか、それともメインプロセスにありますか? – rjp
- 1. Linux APIC割り込み優先度
- 2. Ehcache書き込みビハインドキャッシングスレッド優先度
- 3. GPIOピンlinux(arm)の割り込みハンドラ
- 4. ARM GIC Linaro GCCの割り込みハンドラ
- 5. 読み取りと書き込みのマルチスレッドで優先と優先のライター
- 6. 書き込み優先度のJava変数
- 7. Tensorflow:値割り当て操作の優先度
- 8. インラインクラス優先度
- 9. Arduinoで割り込み優先順位を設定する方法は?
- 10. WIX MSI - 財産優先優先度
- 11. Akka俳優優先度
- 12. MySQLの優先度
- 13. アプリケーションの優先度
- 14. activemqの優先度
- 15. AsyncCallbackの優先度
- 16. 角度HTTPの優先度
- 17. ARM A9割り込みの完了のGIC順序
- 18. カフカコンシューマー - より高い優先度のトピック
- 19. ブートローダ。 ARM CORTEX M0 +割り込みテーブルアセンブリの再配置エラー
- 20. 優先度キュー - バイナリヒープ
- 21. Java優先度キュー
- 22. 301リダイレクト優先度?
- 23. 優先度キューで優先度を設定する方法
- 24. Python:優先度として優先度キュー
- 25. 優先度の逆転では、なぜ優先度の高いプロセスが中優先度のプロセスを先取りできないのですか?
- 26. Androidのレイアウトの優先度
- 27. .Netのリアルタイム優先度
- 28. Eclipseのタスク優先度
- 29. PHP型キャストの優先度
- 30. NSOperationQueue操作の優先度
上記の関数はSPIコントローラをポーリングするか、割り込みが到着するのを待つでしょう。 – Notlikethat
割り込みハンドラでのブロック読み出し(またはブロック何か)は本当に悪い考えです。割り込みは、できるだけ速くする必要があります。 –