jsjlj 发表于 2010-11-19 14:07:06

arm的ucos说是支持中断嵌套,不理解它的执行过程

请问各位:
   书上说ARM不直接支持中断嵌套,要实现中断嵌套只能发生中断时切换到系统模式后去执行中断服务程序并打开中断,然后就在中断服务程序执行中也可以响应更新优先及的中断,最新服务程序执行完后就返回到上层中断服务程序的断点处,这样就可以实现中断嵌套了。
但我看中断服务程序,怎么好像看到这样的实现步聚。
如下:
UCOS_IRQHandler


      stmfd sp!,{r0-r3,r12,lr} ;保存现场


      bl OSIntEnter          ;跳到下面程序,实际上是中断嵌套

      bl C_IRQHandler       ;计算出中断号

      bl OSIntExit          ;中断减1 ,切换最高优先级任务


      ldr r0,=OSIntCtxSwFlag ; 判断是否需要中断切换

      ldr r1,

      cmp r1,#1

      beq _IntCtxSw         ;调用中断任务切换函数,后面分析


      ldmfd sp!,{r0-r3,r12,lr} ;恢复现场

      subs pc,lr,#4

void OSIntEnter (void)

{

    if (OSRunning == OS_TRUE) {

      if (OSIntNesting < 255u) {

            OSIntNesting++;                      /* 中断记数+1                        */

      }

    }

}

如上面在中断入口处保护好了相关寄存器后,进入真正的中断服务程序C_IRQHandler前先执行OSIntEnter函数嵌套变量自加1,其它没有动作;
然后直接进入中断服务函数C_IRQHandler,再然后执行OSIntExit()函数退出中断,根据情况是否切换任务。
但这个过程中没有切换模式,在进入服务函数时也没有开中断。
是不是上面的中断程序没有实现中断嵌套功能??请侠客请教!在此谢过了!

jsjlj 发表于 2010-11-22 17:17:09

等待已入,没人捧场。

jsjlj 发表于 2010-12-7 11:09:24

高手们响应一下吧!

AVR_DIY 发表于 2010-12-7 12:25:14

回复【2楼】jsjlj
高手们响应一下吧!
-----------------------------------------------------------------------

ucos支持中断嵌套,并没有说它帮你做中断嵌套!!
能不能嵌套跟你的CPU有关,不支持中断优先级嵌套的CPU,嵌套还是要你自己来实现!OS只是记录了你嵌套的次数。
页: [1]
查看完整版本: arm的ucos说是支持中断嵌套,不理解它的执行过程