请教:ucos执行中断程序时的任务现场保护问题!
[复制链接]
我用的是uc/os-v2.52... 中断机制如下:
Void ISP_Function( void )
{
保存全部的CPU寄存器;
调用OSIntEnter()或OSIntNesting++;
If(OSIntNesting == 1 )
{
OSTCBCur->OSTCBStkPtr= SP ;
}
清中断源;
重新打开中断;
执行用户代码做中断服务;
调用OSIntExit();
恢复所有CPU寄存器;
执行中断返回指令;
}
我注意到,在节拍中断函数OSTickISR( )里面用汇编写下了这段代码:OSTCBCur->OSTCBStkPtr= SP (将堆栈指针放入任务控制块内)
我现在不太明白:
1.对于咱们写的中断函数里面,这段代码OSTCBCur->OSTCBStkPtr= SP是在哪里实现的?要是不执行这段代码,恢复现场的时候上哪找原来任务的堆栈指针去?
2.同时进入中断函数以后,保存全部的CPU寄存器、清中断源和重新打开中断,这两个步骤的代码是编译器替你完成的,还是需要你自己写的?
比如我写的中断函数如下:
void uart0Isr (void) //串行口0中断处理函数
{
INT8U i ;
OSIntEnter( ) ;
for(i=0; i<8; i++)
{
U0THR=a[i++] ;
}
OSSemPost(sem) ;
OSIntExit( ) ;
}
针对上面的中断函数,我想请教一下:
1.何时由哪段代码进行了保存全部的CPU寄存器的操作?
2.何时进行了OSTCBCur->OSTCBStkPtr= SP的操作?或者任务运行时,SP在中断发生时是如何被保存到任务控制块(OS_TCB)内的?如果不保存,如何进行现场恢复?
3.清中断源和重新打开中断的操作,是人为执行的,还是硬件完成的?如果是人为执行的,是不是在我的中断函数里面需要手动清中断源和开中断? 4.进入中断的时候是不是硬件自动关中断?如果不是,为什么需要在后面开中断?谢谢...
|