stm32f4xx uC で C の組み込みプロジェクトに取り組んでいます。
ループ操作 XYZ を連続して実行するコードの一部があり、時々 TIM4 割り込みがいくつかのグローバル パラメータを変更し、操作 XYZ を再開させます。
コードは次のようなものです。
for (;;) {
//line A
XYZ;
//line B
}
XYZ は、バッファとその他の間のデータ転送を含む複雑な操作です。
TIM4 割り込みハンドラはこれを行います: XYZ を停止し、XYZ 操作に影響するいくつかのグローバルを変更します。
したがって、基本的には、XYZ を繰り返し実行し、TIM4 割り込みで XYZ を停止し、パラメータを変更してから、新しいグローバル パラメータで XYZ を再起動してループを再開する必要があります。
問題: XYZ には多くの命令があるため、TIM4 IRQ がその途中で発生する可能性があり、IRQHandler がグローバルを変更した後、XYZ の途中から操作が再開され、プログラムが台無しになります。
私の最初の解決策: __disable_irq() で行 A の割り込みを無効にし、__enable_irq() で行 B でそれらを復元します。
XYZ 複合操作は他の割り込み (TIM4 以外) を使用する必要があるため、失敗します。
次の解決策 次のコマンドを使用して、ライン A の TIM4 割り込みのみを無効にします。
TIM_ITConfig(TIM4, TIM_IT_Update , DISABLE)
次のコマンドを使用して、B行で有効に戻します。
TIM_ITConfig(TIM4, TIM_IT_Update , ENABLE)
割り込みを失っているため失敗します。int が復元されると、XYZ 中に到着した割り込みは無視されます。これは大きな問題です (理由の 1 つは、TIM4 IRQHandler がグローバルを変更し、TIM4 を再度アクティブにして後で割り込みを発生させることです。割り込み間の期間が異なるため、私はこれを行います)。
誰でもこの問題の解決策を教えてもらえますか? TIM4 IRQ を無効化/復元し、割り込みを失わないようにするより良い方法はありますか?