ucOSII 学习之初识实时操作系统-时间管理

来源:互联网 发布:unix高级编程第四版pdf 编辑:程序博客网 时间:2024/05/16 18:02
  

ucosII需要提供定时中断,以实现禅师和延时控制功能。这个定时中断叫做时钟节拍。时钟节拍的频率越高,系统的负荷越重。

OSTimeTick()用于通知ucosII发生了时钟节拍中断。

OSTimeDly()

OSTimeDlyHMSM()

OSTimeDlyResume()

OSTimeGet()

OSTimeSet()

这些函数可以再OS_TIME.c文件中找到。必须通过OS_CFG.h中的一些常量,才能使一些时间管理函数呗允许使用。

1 OSTimeDly()

将任务延时一段特定时间的功能函数。时间长短有指定的时钟节拍的数目决定。调用该函数会使系统进行一次任务调度,从而去执行下一个优先级最高的任务就绪。调用延时函数后一旦规定的时间期满或有其他的任务通过调用OSTimeDlyResume()取消了延时,他就会立即进入就绪状态。

时钟节拍数 1--65536.指定0值不进行任何延时。

//1.OSTimeDly()函数
void OSTimeDly(INT16U ticks)
{
    INT8U y;
#if OS_CRITICAL_METHOD== 3
    OS_CPU_SR cpu_sr =0;
#endif
    if(OSIntNesting> 0) {
        return;//在中断处理函数中调用了OSTimeDly(),那么直接退出
    }
    if(ticks> 0) {
        OS_ENTER_CRITICAL();
//调用OSTimeDly()的进程自己把自己从就绪控制矩阵中拿下来,
//即:去掉调度器(x,y)矩形阵列(OSRdyTbl,OSRdyGrp)中该task对应的bit位,使得调度器不考虑
//该task的调度
        y = OSTCBCur->OSTCBY;
        OSRdyTbl[y]&= ~OSTCBCur->OSTCBBitX;
        if(OSRdyTbl[y]== 0){
            OSRdyGrp &= ~OSTCBCur->OSTCBBitY;
        }
//延时ticks值,放入OSTCBDly单元,在os时钟滴答处理函数OSTimeTick()中,会处理该单元[gliethttp]
        OSTCBCur->OSTCBDly= ticks;
        OS_EXIT_CRITICAL();
//因为本task正在运行,所以本task现在的优先级最高,现在本task已经将自己从就绪控制矩阵中--调度器(x,y)矩形阵列
//把自己摘掉,所以调度函数OS_Sched()一定会切换到另一个task中执行新task的代码[gliethttp]
        OS_Sched();//具体参见《浅析μC/OS-II v2.85内核调度函数》
    }//ticks==0,那么什么也不做
}

想延时一个时钟节拍,而实际上只在0--1个节拍之间结束延时。所以如果程序想延时至少一个节拍,必须指定延时2个节拍。

2 OSTimeDlyHMSM()按时分秒延时函数

 由于OSTimeDlyHMSM()的具体实现方法,用户不能结束延时调用OSTimeDlyHMSM()要求延时超过65535个节拍的任务。换句话说,如果时钟节拍的频率是100Hz,用户不能让调用OSTimeDlyHMSM(0,10,55,350)或更长延迟时间的任务结束延时。

3恢复延时的任务 OSTimeDlyResume()

   μC/OS-Ⅱ允许用户结束延时正处于延时期的任务。延时的任务可以不等待延时期满,而是通过其它任务取消延时来使自己处于就绪态。这可以通过调用OSTimeDlyResume()和指定要恢复的任务的优先级来完成。实际上,OSTimeDlyResume()也可以唤醒正在等待事件(参看第六章——任务间的通讯和同步)的任务,虽然这一点并没有提到过。在这种情况下,等待事件发生的任务会考虑是否终止等待事件。

  系统时间,OSTimeGet()和OSTimeSet()

   无论时钟节拍何时发生,μC/OS-Ⅱ都会将一个32位的计数器加1。这个计数器在用户调用OSStart()初始化多任务和4,294,967,295个节拍执行完一遍的时候从0开始计数。在时钟节拍的频率等于100Hz的时候,这个32位的计数器每隔497天就重新开始计数。用户可以通过调用OSTimeGet()来获得该计数器的当前值。也可以通过调用OSTimeSet()来改变该计数器的值。OSTimeGet()和OSTimeSet()两个函数的代码如程序清单L5.4所示。注意,在访问OSTime的时候中断是关掉的。这是因为在大多数8位处理器上增加和拷贝一个32位的数都需要数条指令,这些指令一般都需要一次执行完毕,而不能被中断等因素打断。

0 0