前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Utility之定时

Utility之定时

作者头像
Taishan3721
发布2019-09-10 15:31:42
6920
发布2019-09-10 15:31:42
举报
文章被收录于专栏:这里只有VxWorks这里只有VxWorks

VxWorks里常用的定时/延时机制

  • taskDelay()
  • sleep()/nanosleep()
  • WatchDog
  • Auxiliary Clock
  • Timestamp

taskDelay()

详情见《Task之任务的控制

  • ticks为0时 - 将当前任务(正在就绪队列中执行)移动到同优先级任务的尾部(仍在就绪队列中)
  • ticks为n(大于0)时 - 将当前任务(正在就绪队列中执行)移动到延时队列,并在遇到系统时钟的第n个tick时,将其移回就绪队列。因此实际delay时长为(n-1, n]个tick,也就是说taskDelay()有0-1个tick的误差
  • 任务在延时队列中,如果遇到非阻塞、非忽略的signal,taskDelay()返回ERROR,并设置ERRNO为EINTR
  • 任务回到就绪队列后,可能前面有高(或同等)优先级任务,因此delay时间可能会变长

sleep()/nanosleep()

这俩是POSIX标准的函数,也是延时操作,将当前任务移到延时队列,其底层就是调用的taskDelay(),即其精度也是取决于系统时钟。与taskDelay()的不同是

  • 参数是时间
  • rmtp不为NULL时 – 用于存储sleep()/nanosleep()因为signal提前返回而剩余的时长
  • 定时为0时(secs=0;rqtp->tv_sec=rqtp->tv_nsec=0) - 不做任何操作
  • 定时不为0时 - 延时至少参数时长(向上取整,基数是系统时钟)再加1个系统时钟tick

可以看到,sleep 1秒的话,结果是1秒加1个tick,这样就防止了taskDelay()的那个小于1个tick的误差

nanosleep()也是这样操作的:

当系统时钟每个tick是1毫秒时,nanosleep()1个纳秒的话,其实是:向上取整为1毫秒(基数是tick的1毫秒)再加1个tick(1毫秒),即2毫秒。而nanosleep()略大于1毫秒(例如1000001)时,其实是:向上取整(2毫秒)再加1个tick(1毫秒),即3毫秒

WatchDog

详情见《Component之WatchDog

其定时精度也是取决于系统时钟,但与taskDelay() / sleep() /nanosleep()的区别是:WatchDog定时后的操作是以中断形式执行的,不会受到其它高优先级任务的干扰

Auxiliary Clock

详情见《Component之辅助时钟

定时精度可以远高于WatchDog,而且定时是周期性的

Timestamp

详情见《Component之时间戳

定时精度最高,可以到纳秒,但多数板子里只支持轮询模式

你还知道哪些定时机制?

这正是:

定时机制有多种,越罗蜀锦各不同。

阻塞、轮询易调用,高频中断显奇能。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-09-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 这里只有VxWorks 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档