ネストされたコールとは、無効に元の値を復元し、MCU割り込み方法を有効にできます

需要の導入

割り込みは重要かつ困難な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種類の

おすすめ

転載: www.cnblogs.com/rimelink/p/12617679.html