Разрешение прерываний :
Код
asm("CPSIE i");
Запрещение прерываний:
Код
asm("CPSID i");
Если компилятор IAR подлючаем "intrinsics.h "
и юзаем функции
Код
__disable_interrupt(void);
__enable_interrupt(void);
unsigned long __get_PRIMASK( void );
void __set_PRIMASK( unsigned long );
unsigned long __get_FAULTMASK( void );
void __set_FAULTMASK(unsigned long);
unsigned long __get_BASEPRI( void );
void __set_BASEPRI( unsigned long );
Если программа работает без операционки то атомарность нужно соблюдать относительно 1 какогото прерывания и лучше его запрещать/разрешать в NVIC.
Код
inline void EntrCritSection(void)
{
if(CriticalSecCntr == 0)
{
asm("CPSID i");
}
// avoid lost of one count in case of simultaneously calling from both places
++CriticalSecCntr;
}
inline void ExtCritSection(void)
{
if(--CriticalSecCntr == 0)
{
asm("CPSIE i");
}
}