需要の導入
割り込みは重要かつ困難なMCU開発が無効に必要であると(ISRがしばしば、ハードウェアとプロセスと変数を共有している)、いくつかの重要なキーコードセクションの割り込みを有効にしてください。
コンパイラは、元の文を提供するので、それは、簡単なことだったでしょう
()__disable_interrupt割り込み禁止に、
割り込み__enable_interruptを有効();
ただし、特別な事情の2種類の導入は慎重に設計する必要がありました。
ネストされた呼び出し:割り込みを無効にした後、最初の2,3 ... N回割り込み禁止、割込み最後の時間を有効にするだけ。
回復初期値:割り込みは、割り込みレジスタの現在の状態を保存し、無効;保存された割り込みステータス・レジスタを復元、割り込み許可する場合。
実装コード
/*!
* Nested interrupt counter.
*
* \remark Interrupt should only be fully revert once the value is 0
*/
static uint8_t s_byIrqNestLevel = 0;
static halIntState_t s_intState;
void BoardDisableIrq( void )
{
if (0 == s_byIrqNestLevel)
{
s_intState = __get_interrupt_state();
__disable_interrupt();
}
s_byIrqNestLevel++;
}
void BoardEnableIrq( void )
{
s_byIrqNestLevel--;
if (0 == s_byIrqNestLevel)
{
__set_interrupt_state(s_intState);
}
}
ユニットテスト
初期値、IRQ =有効、ネストされた層= 1
HAL_ENABLE_INTERRUPTS();
BoardDisableIrq();
BoardEnableIrq();
初期値、IRQ =有効、ネストレベル= 2
HAL_ENABLE_INTERRUPTS();
BoardDisableIrq();
BoardDisableIrq();
BoardEnableIrq();
BoardEnableIrq();
初期値は、IRQ =無効、ネストされた層= 1
HAL_DISABLE_INTERRUPTS();
BoardDisableIrq();
BoardEnableIrq();
初期値は、IRQ =無効、ネスティングレベル3 =
HAL_DISABLE_INTERRUPTS();
BoardDisableIrq();
BoardDisableIrq();
BoardDisableIrq();
BoardEnableIrq();
BoardEnableIrq();
BoardEnableIrq();
両方のネストされた通話を可能にするだけでなく、初期値を復元する:ユニットテストの結果は、これら2つの目標を達成するために機能する上述の4種類の