Component之辅助时钟

VxWorks系统里,常用的定时机制有taskDelay()或WatchDog。其实它俩都是基于系统时钟的,而系统时钟需要负责系统的调度,其频率不能设置的太快,因此定时的精度就会有所限制。

VxWorks系统其实还提供了一个辅助时钟Auxiliary Clock,这个辅助时钟与系统时钟使用不同的时钟源,即它俩的频率是无关的。因此,当App需要更高的定时频率时,可以考虑添加组件INCLUDE_AUX_CLK

然后就可以使用Aux的几个函数

从函数名上,大致也可以看出来,Aux关联的函数是在中断里执行的,与WatchDog的工作方式差不多,因此routine()里是不能调用可能阻塞的机制。而且Aux的Rate还有一个硬性的限制[AUX_CLK_RATE_MIN, AUX_CLK_RATE_MAX]。例如当前X86设备里的范围就是[2, 8192]

使用组件INCLUDE_TIMER_SYS_SHOWvxbAuxClkShow()可以看到当前Aux的基本属性

mc146818Rtc这个Name,可以在源码里找到对应的驱动

然后在这个文件里可以看到Rate的取值范围

原来[2, 8192]的限制是从这里来的,而且还可以发现:这个Rate只能是2的幂,不接受中间值。这应该是X86里这个Device的硬件属性来决定的,如果是其它Arch的Device,有可能就没有这个限制了

写个例子

从这个例子里,可以看到辅助时钟关联的ISR是周期性执行,这与WatchDog的单次触发是不同的

执行一下,先随便给个参数

可以看到,Aux的Rate自动调整为2的幂

试试其它值,例如设置Aux的Rate为2048,然后记录一下触发2048次Aux中断的时长,应该是1000毫秒(根据代码逻辑,可能有1个tick的误差)

这正是:

辅助时钟 定时备选

可设高频 独立中断

原文发布于微信公众号 - 这里只有VxWorks(VxWorks567)

原文发表时间:2019-09-02

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券