ARM的开关中断

前一段时间刚学了一下ARM,就是用以前买的zlg的开发板。
研究了一下开关中断的代码
//开中断

 

 void OS_DI(void)
{
 __asm
 {
  MRS R0,CPSR
  ORR R0,R0,#0x80
  MSR CPSR_c,R0
 }
}

//关中断
void OS_EI(void)
{
 __asm
 {
  MRS R0,CPSR
  BIC R0,R0,#0x80
  MSR CPSR_c,R0
 }
}
这个都比较简单,但是在使用的时候却出了一些问题,
主要是这样的,一个是嵌套的问题,还有一个是中断的问题
第一个问题其实是我已经考虑到了,实际的代码是这样的
在一个头文件定义宏
#define OS_ENTER_CRITICAL() { OS_DI(); OsEnterSum++; }
#define OS_EXIT_CRITICAL() { if(OsEnterSum > 0) OsEnterSum--; if(OsEnterSum == 0) OS_EI(); }
OsEnterSum是个全局变量
这样嵌套就没有问题了

第二个问题是在中断的问题。如果在中断中调用了OS_EXIT_CRITICAL(),就开中断的了,在一些情况下是不能开中断的。
所以在中断中的调用要告诉我的一些函数是在中断中调用系统函数,
其实也不是很复杂,这样就可以了
#define OS_ENTER_ISR() { OsEnterSum = 1; }
#define OS_EXIT_ISR() { OsEnterSum = 0; }
中断函数象这样写
 void __irq IRQ_Exception(void)
{
    OS_ENTER_ISR(); 
    //中断处理的具体代码
    OS_EXIT_ISR();
}
这样就可以了

 

posted @ 2006-08-09 14:54  尤克斌  阅读(1012)  评论(0)    收藏  举报