如何获取MC9S12ZVM处理器上的当前中断状态(启用,禁用或当前级别)

时间:2015-10-09 19:14:09

标签: embedded microcontroller

我正在使用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);

只要我不需要做一个简单的变量++以外的任何事情,这是可以的,但我不想退出修改堆栈的块。

2 个答案:

答案 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 );

}