Permite chamadas aninhadas e restaurar os valores originais, desabilitar e habilitar método de interrupção MCU

A introdução da demanda

Interrupções são o desenvolvimento importante e difícil MCU requer desabilitar e habilitar interrupções em alguns seção de código-chave crítica (ISR é muitas vezes hardware e processos e variáveis compartilhado).
Teria sido uma coisa fácil, porque o compilador fornece declaração original
para desativar as interrupções __disable_interrupt ();
permitir __enable_interrupt interrupção ();

No entanto, a introdução de dois tipos de circunstâncias especiais necessário um projeto cuidadoso.
chamadas aninhadas: Após desativar interrupções, o primeiro 2,3 ... N vezes desabilitar interrupções, apenas quando o último tempo para ter efeito quando a interrupção.
Recuperação Valor inicial: interrupções desativadas, salvando o estado actual do registo de interrupção; quando ativado interrupção, restaurando os registros de status de interrupção salvos.

código de implementação

/*!
 * 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); 
    }
}

O teste de unidade

Valor inicial, IRQ = Activar, camada aninhada = 1

HAL_ENABLE_INTERRUPTS();
BoardDisableIrq();
BoardEnableIrq();

Valor inicial, IRQ = Activar, nvel de encadeamento = 2

HAL_ENABLE_INTERRUPTS();
BoardDisableIrq();
BoardDisableIrq();
BoardEnableIrq();
BoardEnableIrq();

Valor inicial, IRQ = Desactivar, camada aninhada = 1

HAL_DISABLE_INTERRUPTS();
BoardDisableIrq();
BoardEnableIrq();

Valor inicial, IRQ = INACTIVO, nvel de encadeamento 3 =

HAL_DISABLE_INTERRUPTS();
BoardDisableIrq();
BoardDisableIrq();
BoardDisableIrq();
BoardEnableIrq();
BoardEnableIrq();
BoardEnableIrq();

Quatro tipos de resultados de teste de unidade descritos acima funções para atingir os objectivos destes dois: permite que ambas as chamadas aninhadas, mas também para restaurar o valor inicial.

Acho que você gosta

Origin www.cnblogs.com/rimelink/p/12617679.html
Recomendado
Clasificación