按时分秒延时函数 OSTimeDlyHMSM()
来源:互联网 发布:现在有5g网络吗 编辑:程序博客网 时间:2024/05/07 03:38
- OSTimeDly()虽然是一个非常有用的函数,但用户的应用程序需要知道延时时间对应的时钟节拍的数目。用户可以使用定义全局常数OS_TICKS_PER_SEC(参看OS_CFG.H)的方法将时间转换成时钟段,但这种方法有时显得比较愚笨。笔者增加了OSTimeDlyHMSM()函数后,用户就可以按小时(H)、分(M)、秒(S)和毫秒(m)来定义时间了,这样会显得更自然些。与OSTimeDly()一样,调用OSTimeDlyHMSM()函数也会使µC/OS-Ⅱ进行一次任务调度,并且执行下一个优先级最高的就绪态任务。任务调用OSTimeDlyHMSM()后,一旦规定的时间期满或者有其它的任务通过调用OSTimeDlyResume()取消了延时(参看5.02,恢复延时的任务OSTimeDlyResume()),它就会马上处于就绪态。同样,只有当该任务在所有就绪态任务中具有最高的优先级时,它才会立即运行。
- 程序清单 L5.2所示的是OSTimeDlyHMSM()的代码。从中可以看出,应用程序是通过用小时、分、秒和毫秒指定延时来调用该函数的。在实际应用中,用户应避免使任务延时过长的时间,因为从任务中获得一些反馈行为(如减少计数器,清除LED等等)经常是很不错的事。但是,如果用户确实需要延时长时间的话,µC/OS-Ⅱ可以将任务延时长达256个小时(接近11天)。
- OSTimeDlyHMSM()一开始先要检验用户是否为参数定义了有效的值[L5.2(1)]。与OSTimeDly()一样,即使用户没有定义延时,OSTimeDlyHMSM()也是存在的[L5.2(9)]。因为µC/OS-Ⅱ只知道节拍,所以节拍总数是从指定的时间中计算出来的[L5.2(3)]。很明显,程序清单 L5.2中的程序并不是十分有效的。笔者只是用这种方法告诉大家一个公式,这样用户就可以知道怎样计算总的节拍数了。真正有意义的只是OS_TICKS_PER_SEC。[L5.2(3)]决定了最接近需要延迟的时间的时钟节拍总数。500/OS_TICKS_PER_SECOND的值基本上与0.5个节拍对应的毫秒数相同。例如,若将时钟频率(OS_TICKS_PER_SEC)设置成100Hz(10ms),4ms的延时不会产生任何延时!而5ms的延时就等于延时10ms。
- µC/OS-Ⅱ支持的延时最长为65,535个节拍。要想支持更长时间的延时,如L5.2(2)所示,OSTimeDlyHMSM()确定了用户想延时多少次超过65,535个节拍的数目[L5.2(4)]和剩下的节拍数[L5.2(5)]。例如,若OS_TICKS_PER_SEC的值为100,用户想延时15分钟,则OSTimeDlyHMSM()会延时15x60x100=90,000个时钟。这个延时会被分割成两次32,768个节拍的延时(因为用户只能延时65,535个节拍而不是65536个节拍)和一次24,464个节拍的延时。在这种情况下,OSTimeDlyHMSM()首先考虑剩下的节拍,然后是超过65,535的节拍数[L5.2(7)和(8)](即两个32,768个节拍延时)。
- 程序清单 L 5.2 OSTimeDlyHMSM().
- INT8U OSTimeDlyHMSM (INT8U hours, INT8U minutes, INT8U seconds, INT16U milli)
- {
- INT32U ticks;
- INT16U loops;
- if (hours > 0 || minutes > 0 || seconds > 0 || milli > 0) { (1)
- if (minutes > 59) {
- return (OS_TIME_INVALID_MINUTES);
- }
- if (seconds > 59) {
- return (OS_TIME_INVALID_SECONDS);
- }
- If (milli > 999) {
- return (OS_TIME_INVALID_MILLI);
- }
- ticks = (INT32U)hours * 3600L * OS_TICKS_PER_SEC (2)
- + (INT32U)minutes * 60L * OS_TICKS_PER_SEC
- + (INT32U)seconds * OS_TICKS_PER_SEC
- + OS_TICKS_PER_SEC * ((INT32U)milli
- + 500L/OS_TICKS_PER_SEC) / 1000L; (3)
- loops = ticks / 65536L; (4)
- ticks = ticks % 65536L; (5) OSTimeDly(ticks); (6)
- while (loops > 0) { (7)
- OSTimeDly(32768); (8)
- OSTimeDly(32768);
- loops--;
- }
- return (OS_NO_ERR);
- } else {
- return (OS_TIME_ZERO_DLY); (9)
- }
- }
- 由于OSTimeDlyHMSM()的具体实现方法,用户不能结束延时调用OSTimeDlyHMSM()要求延时超过65535个节拍的任务。换句话说,如果时钟节拍的频率是100Hz,用户不能让调用OSTimeDlyHMSM(0,10,55,350)或更长延迟时间的任务结束延时。
0 0
- 按时分秒延时函数 OSTimeDlyHMSM()
- 按时分秒延时函数 OSTimeDlyHMSM()
- UCOS 的延时函数OSTimeDlyHMSM()实现精确延时 .
- UCOS 的延时函数OSTimeDlyHMSM()实现精确延时
- MSP430移植μCOS-II系统之时间管理函数OSTimeDlyHMSM()延时不准确解析
- OSTimeDlyHMSM()-用户不能结束延时调用
- μCOS-II系统之时间管理函数OSTimeDlyHMSM()
- μCOS-II系统之时间管理函数OSTimeDlyHMSM()
- μCOS-II系统之时间管理函数OSTimeDlyHMSM()
- 延时函数
- 延时函数
- 延时函数
- 延时函数
- 延时函数
- 延时函数
- 延时函数
- 延时函数
- 延时函数
- logback滚动输出压缩格式的文件
- MongoDB: No server chosen by ReadPreferenceServerSelector
- 极光推广
- 3141218.html
- leecode 之 longestcommonprefix
- 按时分秒延时函数 OSTimeDlyHMSM()
- visual studio 2008无法打开包括文件:“iostream.h”: No such file or directory
- 朝礼
- 欢迎使用CSDN-markdown编辑器
- opposdk---Are you missing a call to unregisterReceiver()?
- java中jar包内的类访问jar包内部的资源文件的路径问题
- Spring4整合MyBatis3(3)
- 对spring web启动时IOC源码研究
- opencv 1.0 基础数据结构