这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 基础知识 » 中断嵌套的问题

共2条 1/1 1 跳转至

中断嵌套的问题

院士
2006-09-17 18:14:16     打赏
中断嵌套的问题



关键词: 中断     嵌套     问题    

院士
2006-12-22 22:43:00     打赏
2楼
问 我是一个初学者用的是周工的2100开发套用的是模板可是不会开嵌套中断有那位楼主可以指点一下给个例子呀? 1: 关于中断嵌套:
进入IRQ中断后,ARM会自动关闭中断。
之所以这样做,也是有原因的:
IRQ模式下的LR是用来保存中断返回地址的,如果在IRQ1中断中被IRQ2中断所中断,那么LR就会保存新中断IRQ2的返回地址,这样中断IRQ1就无法正确返回!要做到中断嵌套可以:

在中断入口处除了保存一些重要数据外,还应该将LR-4(返回地址)保存。此时再开中断,并通知中断控制器中断处理结束(向其写入0)。
中断返回时,记得恢复LR后再执行返回。 2: 非也非也,中断时PC值自动复制到 IRQ 模式的 LR 中所以,仅仅保存LR是不够的,必须切换工作模式。
简单的步骤:

--> IRQ 中断
--> 保存所有寄存器,包括 LR,SPSR 到 IRQ 的堆栈;
--> 切换到其它特权模式(比如系统模式),并使用的该模式的堆栈;
--> 开中断,允许嵌套

......

--> 关中断
--> 切换到IRQ模式
--> 恢复所有寄存器,包括 LR,SPSR
-> 中断返回

要注意各模式下的堆栈的使用。 3: 添加:
深思大虾提醒的对,不过需要补充的是:

1.当你的中断程序中不会进行子程序跳转时,
  是可以通过保存LR来完成中断嵌套的

2.如果IRQ中断中进行子程序调用,那么就需
  要进行模式切换以达到最好的安全性,因为
  子程序跳转也是要用到LR寄存器的保存返回
  地址的,所以如果在子程序执行过程中被中
  断,子程序是无法返回的(LR被覆盖)。
4: 下同是LPC2214上的UCOS一段有关中断的代码,void IRQCTimer0(void){
   #if OS_CRITICAL_METHOD == 3                                
    OS_CPU_SR  cpu_sr;
#endif

    OS_ENTER_CRITICAL();
    TIMER0_IR = 0x01;
    VICVectAddr = 0;            // 通知中断控制器中断结束
    OS_EXIT_CRITICAL();
    OSTimeTick();    
    
}

问题1:如果不运行OS_ENTER_CRITICAL();时,此时中断是开着的还是关着的,为什么要运行这个关中断指令呢?
问题2:当执行完OS_EXIT_CRITICAL();,中断处于打开状态,此时调用其它函数,它是怎么保存LR的呢,并且能可靠返回呢?
谢谢! 5: re:注意:
这里使用宏调用,中断产生后,经过汇编程序处理后才会跳转到C语言程序。
所以保护LR等操作在IRQ.INC文件中汇编程序来实现。
ADS的汇编程序的宏调用,还是很方便的。
即:Timer0_Handler  HANDLER Timer0_Exception
你再仔细看看。 6: 第二个问题我搞清楚了,LR中断时,已经保存        MACRO     
$IRQ_AsmEntery HANDLER $IRQ_CEntry
        EXPORT  $IRQ_AsmEntery          ; 输出的标号
        IMPORT  $IRQ_CEntry             ; 引用的外部标号
                
$IRQ_AsmEntery
        stmfd sp!,{r0-r3,r12,lr}

        bl OSIntEnter
        bl $IRQ_CEntry
        bl OSIntExit

        ldr r0,=OSIntCtxSwFlag
        ldr r1,[r0]
        cmp r1,#1
        beq _IntCtxSw

        ldmfd sp!,{r0-r3,r12,lr}
        subs pc,lr,#4        
        MEND 7: re:可以参考例子http://www.zlgmcu.com/download/downs.asp?ID=1114

共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]