1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
ARM第

7.3.6 时钟节拍与时间管理 任何操作系统都要提供一个周期性的信号源,以供系统处理诸如延时、超时等与时间有关的事件,这个周期性的信号源叫做时钟。μC/OS-II与大多数计算机系统一样,用硬件定时器产生一个周期为毫秒(ms)级的周期性中断来实现系统时钟。最小的时钟单位就是两次中断之间间隔的时间,这个最小的时钟单位叫做时钟节拍(Time Tick)。 在μC/OS-II中,必须在多任务系统启动之后,即调用OSStart()函数之后,再打开时钟节拍器。也就是说,在调用OSStart()函数之后应做的第一件事是初始化定时器中断。时钟节拍服务是通过在中断服务子程序中调用函数OSTimeTick()来通知μC/OS-II发生了时钟节拍中断。OSTimeTick()能够跟踪所有任务的定时器并进行超时限制。 此外,μC/OS-II提供了5个时间管理函数来处理有关时间的问题。 1.任务延时函数(OSTimeDly()) 函数OSTimeDly()被任务调用后会将任务延时一段特定的时间,这段时间的长短由指定的时钟节拍的数目确定。当任务调用OSTimeDly()后,一旦规定的时间到或者其他任务通过调用OSTimeDlyResume()取消了延时,该任务就会立即进入就绪态。需要注意的是,调用该函数会使μC/OS-II进行一次任务调度,从而执行优先级最高的就绪态任务。只有当该任务在所有就绪任务中的优先级最高时,它才会立即运行。 2.按时、分、秒、毫秒延时函数(OSTimeDlyHMSM()) 与OSTimeDly()一样,调用OSTimeDlyHMSM()函数也会使μC/OS-II进行一次任务调度,并且执行下一个优先级最高的就绪态任务。在实际的应用中,应避免使任务延时过长的时间,因为从任务中获得一些反馈行为(如减少计数器、清除LED等)经常是很有意义的,但是,如果确实需要长时间的延时,μC/OS-II可以将任务延时长达256小时。 3.恢复延时任务函数(OSTimeDlyResume()) μC/OS-II允许处于延时期的任务不等待延时期满,而通过其他任务取消延时时间使自己处于就绪态。通过指定要恢复的任务的优先级来调用OSTimeDlyResume()函数就可以实现这一功能。此外,OSTimeDlyResume()函数也可以唤醒正在等待事件的任务。在这种情况下,等待事件发生的任务会把它当作等待超时处理,从而终止等待事件。 4.两个系统时间函数(OSTimeGet()和OSTimeSet()) 无论时钟节拍何时发生,μC/OS-II都会将一个32位的计数器加1。这个计数器在调用OSStart()初始化多任务时,被置为0;并且在4 294 967 295个节拍执行完一遍时,会重新从0开始计数。可以通过调用OSTimeGet()函数,获得该计数器的当前值;通过调用OSTimeSet()函数,改变该计数器的值。 7.3.7 μC/OS-II的初始化 在调用系统的其他服务之前,系统要求用户首先调用系统初始化函数OSInit(),它初始化系统所有的变量和数据结构。主要完成以下工作: (1)初始化32位时钟节拍数,中断嵌套层数以及任务调度锁定层数; (2)设定多任务调度尚未开始; (3)初始化任务切换数。以上均为 0; (4)初始化优先级列表,表明没有任务就绪; (5)初始化任务就绪表; (6)定义硬件的堆栈增长方向以及最大任务数 OS_MAX_TASKS; (7)设定最小的任务优先级数,它被赋予给空闲任务; (8)建立空闲任务,将任务始终处于就绪态; (9)建立空闲任务的任务控制块,将它置于任务控制块链表的开始; (10)建立任务控制块(OS_TCB)的空数据结构缓冲区,该缓冲区允许系统从缓冲区中迅速的得到或者释放其中一个任务控制块。任务控制块的数目取决于最大任务数; (11)建立空时间表(OS_EVENT)缓冲区。该缓冲区是单向链表。允许系统从缓冲区中迅速得到或者释放其中一个元素。 7.3.8 μC/OS-II的启动 多任务的启动是通过 OSStart()实现的。然而,在启动μC/OS-II 之前,至少须建立一个应用任务,其示意性程序代码如下所示。 void main(void) { OSInit(); /* 初始化μC/OS-II */ ……

文档评论(0)

little28 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档