第4章 中断处理与时间管理.ppt

  1. 1、本文档共47页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
4.4 μC/OS-Ⅱ的时间管理 * 4.4.1 任务延时函数,OSTimeDly() C/OS-Ⅱ的任务是一个无限循环,由于μC/OS-Ⅱ是可剥夺型内核,如果高优先级任务不主动挂起,低优先级任务就永远无法取得运行权,最高优先级任务将独占CPU的使用权。因此,μC/OS-Ⅱ规定:除了永不挂起的空闲任务外,其它所有的任务都要在合适的时候调用系统服务函数,自我挂起,暂时放弃CPU使用权,使低优先权任务能够得以运行。 这种系统服务函数就包括这一小节将要介绍的任务延时函数OSTimeDly()和下一小节将要介绍的按时分秒毫秒延时函数OSTimeDlyHMSM()。 * 4.4.1.1 函数原型 void OSTimeDly(INT16U ticks) OSTimeDly()函数申请一个系统提供的延时,延时的单位是一个时钟节拍,最大可延时65535个时钟节拍。 调用该函数后,若延时时间不为0,则立即挂起当前任务,μC/OS-Ⅱ进行一次任务调度,并且执行下一个优先级最高的就绪态任务。 任务调用OSTimeDly()后,一旦规定的时间期满或者有其它的任务通过调用OSTimeDlyResume()取消了延时,它就会马上进入就绪状态。当然,只有当该任务在所有就绪任务中具有最高的优先级时,它才会立即运行。 由于中断不能延时,所以它的调用者一定是任务。 函数只有一个参数ticks: 要延时的时钟节拍数,无返回值。 * 4.4.1.2 注意事项 在调用OSTimeDly()函数时必须注意以下事项: 时间的长短是用时钟节拍的数目来确定的; 可提供的时钟节拍数范围是:1~65,535; 参数为0,表明不进行延时操作,而立即返回调用者; 为了确保设定的延时时间,建议设定的时钟节拍数加1; 只能在任务中调用,无开关量。 * 4.4.1.3程序流程和源代码 * 4.4.2 按时分秒毫秒延时函数,OSTimeDlyHMSM() * 4.4.2.3 注意事项 要使用该函数,首先要用OS_CPU.H文件中定义的全局常数OS_TICKS_PER_SEC将时间转换为时钟节拍数,这个全局常数表示的是每秒钟时钟节拍器产生的节拍数量,称为时钟节拍频率,其值一般设置在10~100Hz之间; 4个参数全为0,表示不进行任何操作,直接返回; 当时钟周期≧1ms时,计时最小单位是一个时钟节拍,精度是0.5个节拍。 例如,若将时钟节拍频率(OS_TICKS_PER_SEC)设置成100Hz(10ms),4ms的延时不会产生任何延时!而5ms的延时就等于延时10ms; 当时钟周期 1ms时,最小计数值 = OS_TICKS_PER_SEC/1000个时钟节拍,分辨率=500L/ OS_TICKS_PER_SEC/1000L。 例如,OS_TICKS_PER_SEC=1000,最小计数单位是1ms,精度 = 0.5(个最小计算单位)。 * 4.4.2.3 注意事项 μC/OS-Ⅱ支持的延时最长为65,535个节拍。要想支持更长时间的延时,需采用一定的算法,一般的做法是将延时时钟数分割为两部分:一部分是65,535个节拍的数目,另一部分是总数减去65,535后剩下的节拍数,然后先算剩下的节拍数,再算65,535节拍数。 例如,若OS_TICKS_PER_SEC的值为100,用户想延时15分钟,则OSTimeDlyHMSM()会延时15×60×100 = 90,000个时钟。这个延时会被分割成两次32,768个节拍的延时(因为用户只能延时65,535个节拍而不是65536个节拍)和一次24,464个节拍的延时。在这种情况下,OSTimeDlyHMSM()首先考虑剩下的节拍,然后是超过65,535的节拍数(即两个32,768个节拍延时)。 由于受到OSTimeDlyHMSM()具体实现方法的限制,用户不能结束延时调用OSTimeDlyHMSM()要求延时超过65,535个节拍的任务。 假如,时钟节拍的频率是100Hz,用户就不能调用OSTimeDlyHMSM(0,10,55,350)或更长延迟时间的任务; 只能在任务中调用。 * 4.4.2.4 源代码及其注释 * 4.4.2.5 范例 * 4.4.3让处在延时期的任务结束延时,OSTimeDlyResume() 4.4.3.1 函数原型 INT8U OSTimeDlyResume(INT8U prio) OSTimeDlyResume()函数用于唤醒一个用OSTimeDly()或OSTimeDlyHMSM()函数延时的任务。正在延时的任务可以通过调用该函数取消延时来使自己处于就绪态,而不必等待延时期满。OSTimeDlyResume()还可以唤醒正在等待事件的任务,但不推荐使用这种方法。 另外,如

文档评论(0)

精品报告 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档