我正在使用MC9S12ZVM系列处理器处理项目,并且需要能够获取,保存和恢复当前的中断启用状态。这是从主线代码访问变量所需要的,这些变量可能被中断处理程序修改,这些变量大于word的大小,因此不是原子的。
伪代码:(变量是32位, - = isn&t; t原子无论如何)
state_save = current_interrupt_state();
DisableInterrupt();
variable -= x;
RestoreInterrupts(state_save);
编辑:我发现了一些有用的东西,但是有修改堆栈的问题。
asm(PSH CCW);
asm(SEI);
Variable++;
asm(PUL CCW);
只要我不需要做一个简单的变量++以外的任何事情,这是可以的,但我不想退出修改堆栈的块。
答案 0 :(得分:1)
看来你指的是全局中断掩码。如果是这样,那么这是一种禁用它然后将其恢复到以前状态的方法:
static const uint8_t CCR_I_MASK = 0x10;
static uint8_t ccr;
void disable_interrupts (void)
{
__asm PSHA;
__asm TPA; // transfer CCR to A
__asm STA ccr; // store CCR in RAM variable
__asm PULA;
__asm SEI;
}
void restore_interrupts (void)
{
if((ccr & CCR_I_MASK) == 0)
{
__asm CLI; // i was not set, clear it
}
else
{
; // i was set, do nothing
}
}
__asm
特定于Codewarrior编译器,有或没有"严格的ANSI"选项集。
答案 1 :(得分:0)
好的,我已经找到了问题的答案,感谢那些评论过的人。
static volatile uint16_t v = 0u;
void testfunction(void);
void testfunction(void)
{
static uint16_t L_CCR;
asm( PSH D2 );
asm( TFR CCW, D2);
asm( ST D2, L_CCR );
asm( PUL D2 );
asm( SEI );
v++;
asm( PSH D2 );
asm( LD D2, L_CCR );
asm( TFR D2, CCW);
asm( PUL D2 );
}