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.