首页 理论教育 μC/OS-Ⅱ时间管理及任务调度

μC/OS-Ⅱ时间管理及任务调度

时间:2023-11-23 理论教育 版权反馈
【摘要】:与大部分内核一样,μC/OS-Ⅱ要求提供定时中断,以实现延时与超时控制等功能。任务调用OSTimeDlyHMSM()后,一旦规定的时间期满或者有其他的任务通过调用OSTimeDlyResume()取消了延时,它就会马上处于就绪态。恢复延时的任务函数OSTimeDlyResume()μC/OS-Ⅱ允许用户结束正处于延时期的任务。系统时间函数OSTimeGet()和OSTimeSet()无论时钟节拍何时发生,μC/OS-Ⅱ都会将一个32 位的计数器加“1”。在时钟节拍的频率等于100 Hz 时,这个32 位的计数器每隔497 d 就重新开始计数。

μC/OS-Ⅱ时间管理及任务调度

与大部分内核一样,μC/OS-Ⅱ要求提供定时中断,以实现延时与超时控制等功能。 这个定时中断称为时钟节拍。

(1)任务延时函数OSTimeDly()

μC/OS-Ⅱ提供了这样一个系统服务:申请该服务的任务可以延时一段时间,这段时间的长短是用时钟节拍的数目来确定的,实现这个系统服务的函数称为OSTimeDly()。 调用该函数会使μC/OS-Ⅱ进行一次任务调度,并且执行下一个优先级最高的就绪态任务。 任务调用OSTimeDly()后,一旦规定的时间期满或者有其他的任务通过调用OSTimeDlyResume()取消了延时,它就会马上进入就绪状态。 注意:只有当该任务在所有就绪任务中具有最高的优先级时,它才会立即运行。

用户的应用程序是通过提供延时的时钟节拍数—— 一个1 ~65 535 的数,来调用该函数的。 如果用户指定“0”值,则表明用户不想延时任务,函数会立即返回到调用者。 非“0”值会使得任务延时函数OSTimeDly()将当前任务从就绪表中移除;接着,这个延时节拍数会被保存在当前任务的OS_TCB 中,并且通过OSTimeTick()每隔一个时钟节拍就减少一个延时节拍数;最后,既然任务已经不再处于就绪状态,任务调度程序就会执行下一个优先级最高的就绪任务。

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

OSTimeDly()是一个非常有用的函数,但用户的应用程序需要知道延时时间对应的时钟节拍的数目。 增加了OSTimeDlyHMSM()函数后,用户就可以按时(h)、分(min)、秒(s)和毫秒(ms)来定义时间了,这样会显得更自然。 与OSTimeDly()一样,调用OSTimeDlyHMSM()函数也会使μC/OS-Ⅱ进行一次任务调度,并且执行下一个优先级最高的就绪态任务。 任务调用OSTimeDlyHMSM()后,一旦规定的时间期满或者有其他的任务通过调用OSTimeDlyResume()取消了延时,它就会马上处于就绪态。 同样,只有当该任务在所有就绪态任务中具有最高的优先级时,它才会立即运行。(www.xing528.com)

(3)恢复延时的任务函数OSTimeDlyResume()

μC/OS-Ⅱ允许用户结束正处于延时期的任务。 通过调用OSTimeDlyResume()和指定要恢复的任务的优先级,延时的任务可以不等待延时期满,而是通过其他任务取消延时来使自己处于就绪态。 实际上,OSTimeDlyResume()也可以唤醒正在等待事件的任务。 在这种情况下,等待事件发生的任务会考虑是否终止等待事件。

(4)系统时间函数OSTimeGet()和OSTimeSet()

无论时钟节拍何时发生,μC/OS-Ⅱ都会将一个32 位的计数器加“1”。 这个计数器在用户调用OSStart()初始化多任务和4 294 967 295 个节拍执行完一遍的时候从“0”开始计数。在时钟节拍的频率等于100 Hz 时,这个32 位的计数器每隔497 d 就重新开始计数。 用户可以通过调用OSTimeGet()来获得该计数器的当前值,也可以通过调用OSTimeSet()来改变该计数器的值。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈