|
请问各位:
书上说ARM不直接支持中断嵌套,要实现中断嵌套只能发生中断时切换到系统模式后去执行中断服务程序并打开中断,然后就在中断服务程序执行中也可以响应更新优先及的中断,最新服务程序执行完后就返回到上层中断服务程序的断点处,这样就可以实现中断嵌套了。
但我看中断服务程序,怎么好像看到这样的实现步聚。
如下:
UCOS_IRQHandler
stmfd sp!,{r0-r3,r12,lr} ;保存现场
bl OSIntEnter ;跳到下面程序,实际上是中断嵌套
bl C_IRQHandler ;计算出中断号
bl OSIntExit ;中断减1 ,切换最高优先级任务
ldr r0,=OSIntCtxSwFlag ; 判断是否需要中断切换
ldr r1,[r0]
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()函数退出中断,根据情况是否切换任务。
但这个过程中没有切换模式,在进入服务函数时也没有开中断。
是不是上面的中断程序没有实现中断嵌套功能??请侠客请教!在此谢过了! |
阿莫论坛20周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|