2016-09-15 16 views
1

私はARM Cortex M4 MCUを使用しています。優先度2のGPIO用の割り込みハンドラと優先度3のSPIドライバ(つまりGPIOよりも優先度が低い)を持っていて、GPIOの割り込みハンドラ内から(ブロックする)SPIの読み込みを呼び出すと、SPI関数は動作しますか?ARM Cortex-M4割り込みの優先度

+0

上記の関数はSPIコントローラをポーリングするか、割り込みが到着するのを待つでしょう。 – Notlikethat

+0

割り込みハンドラでのブロック読み出し(またはブロック何か)は本当に悪い考えです。割り込みは、できるだけ速くする必要があります。 –

答えて

2

あなたの質問に対する答えは、転送を処理するためにどのようにブロックされているかによって異なります(@Notlikethat)。

SPIドライバがポーリングドライバの場合は、動作する可能性が高くなります。この場合、GPIO割り込みはSPIペリフェラル内のフラグで回転し、転送の各部分が完了するのを待ちます。

SPIドライバが割り込み駆動型である場合、動作しません。優先順位2割り込み(GPIO)を実行しているので、優先順位3割り込み(SPI)はGPIO割り込みが終了するまで実行されません。 SPIドライバの書き方によっては、システムが完全にハングしたり、タイムアウトになることがあります。

SPIドライバがDMA駆動の場合、答えはあまり明確ではなく、ドライバの仕組みによって異なります。この場合、トランザクションは完了する可能性がありますが、関数がDMA割り込みを待つのをブロックした場合、その優先度に応じて関数が到着しないことがあります。

上記のいずれの場合でも、割り込みの中でそのようなことを行うのは良い考えではないと一般的に考えられます。 RTOSを使用している場合は、セマフォを待っているSPIトランザクションを実行する優先度の高いタスクを使用するか、またはOSがサポートしている場合は、遅延割り込み処理を使用できます。 RTOSを使用していない場合は、優先度の低い割り込み(つまり、PendSVを最も低い優先度で使用する)を通知する方法や、メインプロセス内からフラグを監視する方法があるかどうかを検討します。より優先度の低い割り込みを使用すると、メインプロセスを(もし必要なら)プリエンプトできますが、ほかのすべての割り込みは実行を続行できます。メインプロセスのフラグを監視することができれば、割り込みを続行することもできますが、時間制限がある場合は可能です(アプリケーションの構造に応じて)

+0

私が使用しているMCUは、RTOSなしのNordic nRF52です。私が抱える問題は、4msごとにデータが準備されているSPIセンサーがあり、各割り込みでSPIによって読み取られ、バッファーに格納されます。多数のサンプルが読み取られた後、データが処理されます。処理には10msかかる予定です。したがって、2つのサンプルが処理中に(ダブルバッファに)準備され、格納されることが期待されます。 RTOSがないので、私は何とか新しいデータ読み込み割り込みが処理ハンドラを先取りするようにする必要があります。 続き – tosa

+0

私はSPIの読み込みをGPIO割り込みハンドラで直接実行させることを考えていました。そのため、データ処理関数はメインから(より低い優先度で)実行できます。これを解決する最も単純な(そして堅牢な)方法は何ですか?ありがとう! – tosa

+0

あなたが私に与えた数字に基づいて、あなたが追いつくことができないように思えます。 4ミリ秒ごとに処理するには10ミリ秒かかる新しいデータがあります.1秒後に未処理の150サンプルのバックログがあります。処理はどのようなコンテキストで行われますか?それは割り込みの1つにあるのですか、それともメインプロセスにありますか? – rjp

関連する問題