yanshanbao 发表于 2012-3-5 21:49:43

第五天 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]
查看完整版本: 第五天 UC/OS-II的学习