chap05时间管理

上传人:枫** 文档编号:569974617 上传时间:2024-08-01 格式:PPT 页数:18 大小:217KB
返回 下载 相关 举报
chap05时间管理_第1页
第1页 / 共18页
chap05时间管理_第2页
第2页 / 共18页
chap05时间管理_第3页
第3页 / 共18页
chap05时间管理_第4页
第4页 / 共18页
chap05时间管理_第5页
第5页 / 共18页
点击查看更多>>
资源描述

《chap05时间管理》由会员分享,可在线阅读,更多相关《chap05时间管理(18页珍藏版)》请在金锄头文库上搜索。

1、page12024/8/1嵌入式实时操作系统嵌入式实时操作系统 C/OS-IIpage2024/8/12第5章 时间管理page32024/8/1本章所讲的内容本章所讲的内容:n OSTimeDly()n OSTimeDlyHMSM()n OSTimeDlyResume()n OSTimeGet()n OSTimeSet()page5.0 任务延时函数,任务延时函数,OSTimeDly()OSTimeDly()-申请该服务的任务可以延时一段时间,这段时间的长短是用时钟节拍的数目来确定的。n会引起C/OS-进行一次任务调度,并且执行下一个优先级最高的就绪态任务。n一旦规定的时间期满或者有其它的任

2、务通过调用OSTimeDlyResume()取消了延时,它就会马上进入就绪状态。参数:n一个1 到65535 之间的数,指定延时节拍数。n0 ,表明用户不想延时任务。pagevoid OSTimeDly (INT16U ticks)#if OS_CRITICAL_METHOD = 3 /* Allocate storage for CPU status register */ OS_CPU_SR cpu_sr;#endif if (ticks 0) /* 0 means no delay! */ OS_ENTER_CRITICAL(); if (OSRdyTblOSTCBCur-OSTCBY

3、&= OSTCBCur-OSTCBBitX) = 0) /* Delay current task */ OSRdyGrp &= OSTCBCur-OSTCBBitY; OSTCBCur-OSTCBDly = ticks; /* Load ticks in TCB */ OS_EXIT_CRITICAL(); OS_Sched(); /* Find next task to run! */ 延时详解。如果用户的应用程序至少得延时一个节拍,必须要调用OSTimeDly(2),指定延时两个节拍。page5.1 按时分秒延时函数按时分秒延时函数 OSTimeDlyHMSM()nOSTimeDly()

4、:用户的应用程序需要知道延时时间对应的时钟节拍的数目。用户可以使用定义全局常数OS_TICKS_PER_SEC(参看OS_CFG.H)的方法将时间转换成时钟段。nOSTimeDlyHMSM():可以按小时(H)、分(M)、秒(S)和毫秒(m)来定义时间。INT8U OSTimeDlyHMSM (INT8U hours, INT8U minutes, INT8U seconds, INT16U milli) INT32U ticks; INT16U loops; if (hours 0 | minutes 0 | seconds 0 | milli 0) if (minutes 59) retu

5、rn (OS_TIME_INVALID_MINUTES); /* Validate arguments to be within range */ if (seconds 59) return (OS_TIME_INVALID_SECONDS); if (milli 999) return (OS_TIME_INVALID_MILLI); /* Compute the total number of clock ticks required. */ /* . (rounded to the nearest tick) */ ticks = (INT32U)hours * 3600L + (IN

6、T32U)minutes * 60L + (INT32U)seconds) * OS_TICKS_PER_SEC + OS_TICKS_PER_SEC * (INT32U)milli + 500L / OS_TICKS_PER_SEC) / 1000L; loops = (INT16U)(ticks / 65536L); /* Compute the integral number of 65536 tick delays */ ticks = ticks % 65536L; /* Obtain the fractional number of ticks */ OSTimeDly(INT16

7、U)ticks); while (loops 0) OSTimeDly(32768); OSTimeDly(32768); loops-; return (OS_NO_ERR); return (OS_TIME_ZERO_DLY);若OS_TICKS_PER_SEC 的值为100,用户想延时15 分钟,则OSTimeDlyHMSM()会延时15x60x100=90,000 个时钟。这个延时会被分割成两次32,768 个节拍的延时(因为用户只能延时65,535个节拍而不是65536个节拍)和一次24,464个节拍的延时。page5.2 恢复延时的任务,恢复延时的任务,OSTimeDlyResum

8、e()nC/OS-允许用户结束延时正处于延时期的任务。延时的任务可以不等待延时期满,而是通过其它任务取消延时来使自己处于就绪态。这可以通过调用OSTimeDlyResume()和指定要恢复的任务的优先级来完成。OSTimeDlyResume( ) 函数的原型(函数的原型(OS_Time.C文件中):文件中):INT8U OSTimeDlyResume (INT8U prio) 备注:函数返回值备注:函数返回值 OS_NO_ERR(正常取消)(正常取消)/ OS_TIME_NOT_DLY(延时(延时已到)已到)INT8U OSTimeDlyResume (INT8U prio)#if OS_CR

9、ITICAL_METHOD = 3 /* Allocate storage for CPU status register */ OS_CPU_SR cpu_sr;#endif OS_TCB *ptcb; if (prio = OS_LOWEST_PRIO) return (OS_PRIO_INVALID); OS_ENTER_CRITICAL(); ptcb = (OS_TCB *)OSTCBPrioTblprio; /* Make sure that task exist */ if (ptcb != (OS_TCB *)0) if (ptcb-OSTCBDly != 0) /* See

10、if task is delayed */ ptcb-OSTCBDly = 0; /* Clear the time delay */ if (ptcb-OSTCBStat & OS_STAT_SUSPEND) = OS_STAT_RDY) /* See if task is ready to run */ OSRdyGrp |= ptcb-OSTCBBitY; /* Make task ready to run */ OSRdyTblptcb-OSTCBY |= ptcb-OSTCBBitX; OS_EXIT_CRITICAL(); OS_Sched(); /* See if this is

11、 new highest priority */ else OS_EXIT_CRITICAL(); /* Task may be suspended */ return (OS_NO_ERR); else OS_EXIT_CRITICAL(); return (OS_TIME_NOT_DLY); /* Indicate that task was not delayed */ OS_EXIT_CRITICAL(); return (OS_TASK_NOT_EXIST); /* The task does not exist */page例程例程5-1:本例应用程序的任务使用了延时函数本例应用程

12、序的任务使用了延时函数OSTimeDly()OSTimeDly()进行延时,进行延时,在任务在任务MyTaskMyTask中还调用了函数中还调用了函数OSTimeDlyResume()OSTimeDlyResume()取消了任取消了任务务YouTaskYouTask的延时。为了观察任务的延时。为了观察任务YouTaskYouTask的延时时间的变的延时时间的变化,在钩子函数化,在钩子函数OSTimeTickHook()OSTimeTickHook()输出了任务输出了任务YouTaskYouTask在延在延时时间到时的时钟节拍数。时时间到时的时钟节拍数。page5.3 系统时间,系统时间,OST

13、imeGet()和和OSTimeSet()nOSTime-计数器。无论时钟节拍何时发生,C/OS-都会将一个32 位的计数器加1。这个计数器在用户调用OSStart()初始化多任务和4,294,967,295个节拍执行完一遍的时候从0 开始计数。在时钟节拍的频率等于100Hz 的时候,这个32 位的计数器每隔497 天就重新开始计数。“读读/写写” OSTime 系统变量的函数原型:系统变量的函数原型: INT32U OSTimeGet ( void ) ; /* 返回返回OSTime当当前值前值 */ void OSTimeSet( INT32U ticks ) /* 重置重置OSTime

14、*/pageINT32U OSTimeGet (void)#if OS_CRITICAL_METHOD = 3 /* Allocate storage for CPU status register */ OS_CPU_SR cpu_sr;#endif INT32U ticks; OS_ENTER_CRITICAL(); ticks = OSTime; OS_EXIT_CRITICAL(); return (ticks);pagevoid OSTimeSet (INT32U ticks)#if OS_CRITICAL_METHOD = 3 /* Allocate storage for CPU

15、 status register */ OS_CPU_SR cpu_sr;#endif OS_ENTER_CRITICAL(); OSTime = ticks; OS_EXIT_CRITICAL();page例程例程5-2:设计一个应用程序,在任务中调用函数设计一个应用程序,在任务中调用函数OSTimeGet()OSTimeGet()函数获函数获得并显示系统的时钟节拍数得并显示系统的时钟节拍数OSTime.OSTime.当任务运行当任务运行10s10s时,调时,调用函数用函数OSTimeSet()OSTimeSet()将将OSTimeOSTime的值设为的值设为1010。page18 以上有不当之处,请大家给与批评指正,以上有不当之处,请大家给与批评指正,谢谢大家!谢谢大家!

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 资格认证/考试 > 自考

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号