第五天 UC/OS-II的学习
第五天1-4 怎么处理ISR的。
1. UC/OS中,中断服务子程序要用汇编语言来写。但是如果C语言编译器支持在线汇编的话,可以用C语言写。
2. OSIntNesting 是中断嵌套层数的意思。在开中断之前要先清中断。它在OSIntEnter()中就是++;
3. OSIntExit()是脱离中断函数。 将OSIntNesting--,当嵌套层数减为0时,所有中断就完成了。此时判断有无较高优先级的进入就绪态。然后选择恢复那个寄存器的值。然后执行被中断了的任务。代码5.3.1 是中断脱离函数。
void OSIntExit (void)
{
OS_ENTER_CRITICAL();
if ((--OSIntNesting | OSLockNesting) == 0)
{
OSIntExitY = OSUnMapTbl;
OSPrioHighRdy = (INT8U)((OSIntExitY << 3) + OSUnMapTbl]);
if (OSPrioHighRdy != OSPrioCur)
{
OSTCBHighRdy= OSTCBPrioTbl;
OSCtxSwCtr++;
OSIntCtxSw(); //任务切换。它的代码在OS_CPU_A.C中。不是OSCtxSw() ;
}
}
OS_EXIT_CRITICAL();
}
4. 用户中断服务中做的事情尽量少,通知某任务去做的手段可以使:OSMboxPost()、OSQPost()、OSQPostFront()、OSSemPost().
http://cache.amobbs.com/bbs_upload782111/files_53/ourdev_724346NDIIA5.png
图5.4.1 (原文件名:图片2.png)
图5.4.1 中断的响应过程
5. 时钟节拍
5.1 UC/OS需要用户提供周期性的信号源,用于实现时间延时和确认延时。节拍率应该在10—100HZ之间。
5.2 用户必须在多任务系统启动以后 再启动时钟节拍源计时。
5.3 时钟节拍服务是通过在ISR中调用OSTimeTick()实现的。
6.CPU总是执行就绪表中优先级最高的任务,任务有没有在就绪表中就得依靠OSTimeTick()了。OSTimeTick()很大的工作是给每个用户任务控制块OS_TCB中的时间延时项OSTCBDly减1,当某任务的任务控制块中的时间延时项OSTCBDly减到了零,这个任务就进入了就绪态。而被任务挂起的喊声OSTaskSuspend()挂起的任务则不会进入就绪态。下面是OSTimeTick()的代码。
void OSTimeTick (void) REENTRANT
{
OS_TCB DT_XDATA * ptcb;
OSTimeTickHook();
ptcb = OSTCBList;
while (ptcb->OSTCBPrio != OS_IDLE_PRIO) { OS_ENTER_CRITICAL();
if (ptcb->OSTCBDly != 0) {
if (--ptcb->OSTCBDly == 0) {
if (!(ptcb->OSTCBStat & OS_STAT_SUSPEND)) {
OSRdyGrp |= ptcb->OSTCBBitY;
OSRdyTbl |= ptcb->OSTCBBitX;
} else {
ptcb->OSTCBDly = 1;
}
}
}
ptcb = ptcb->OSTCBNext;
OS_EXIT_CRITICAL();
}
OS_ENTER_CRITICAL();
OSTime++;
OS_EXIT_CRITICAL();
}
7. OStimeTick ()的执行时间直接与应用程序中建立了多少个任务成正比。
8. OSTime是累计从开机以来的时间。
燕山大学电气工程学院09级检测技术与仪器
页:
[1]