注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

深海精灵

水里的一滴油,透明地飘零在空气中。。。

 
 
 

日志

 
 
关于我

神秘诡谲,令人费解。可以很执着,也可以很破坏。冰冷,沉默。渴望单纯,渴望自由。躲在文字的背后,用心聆听世界,用直觉洞察世情。

网易考拉推荐

uCOS实时操作系统——uCOS的时间管理  

2011-08-08 16:36:02|  分类: uCOS实时操作系统 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

  很多时间我们都会用到这样的延时代码:

  void Delay(u32 num)
  { while(num--);  }

  uCOS系统的每个任务都是一个无限循环,任务与任务之间是并行的关系,而且uCOS是一个抢占性内核,为了使高优先级的任务不至于一直独占CPU,让低优先级的任务也有机会获得CPU的使用权,每个任务都要在合适的时候调用某个延时函数,包括:

  OSTimeDly(INT16U n);  //延时n个系统时钟节拍

  OSTimeDlyHMSM(INT8U hours, INT8U minutes, INT8U seconds, INT16U milli);   //延时h小时m分s秒milli毫秒

  采用Delay()软件延时总体效率比较低,因为任务在延时时会占用CPU,特别是在uCOS这样总是高优先级任务运行的系统中,在延时时,CPU一直在执行Delay()代码,没做有用工作。因此,如果任务需要延时,将任务挂起,使CPU转而执行其它任务会使得CPU总的利用率会高很多。

  uCOS提供的延时基于系统时钟,在系统初始化时,会进行系统时钟初始化。系统时钟一般由硬件的某个时钟提供,该时钟会定时中断,称为一个tick。每个tick发生时,系统进入时钟中断ISR。ISR调用OSTimeTick(),对OSTCBList链表中的每个任务进行延时处理,若OSTimeDly==0,如果任务不被挂起,则任务就绪,等待调度。

  因此,任务的延时,并不是要以延时任务时长,理想上总是tick中断间隔的N倍。

 

  虽然uCos提供了延时函数,但因为是基于系统时钟中断的,所有对于小于时钟中断时间间隔的延时,只能通过软件延时Delay()。

  在很多情况下,可以通过信号量、邮箱等方式取代延时功能。

  需要注意的是,在多任务的运行环境中,即使任务延时已经完毕,但由于此时有高优先级的任务运行,此时任务仍不能运行。至任务可以运行时,实际的延时已经超过了预期的延时。

  评论这张
 
阅读(1639)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017