微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 基于VxWorks下的多重定时器设计

基于VxWorks下的多重定时器设计

时间:11-22 来源:互联网 点击:

这里提出一种避免上述情况造成系统死锁的方法,即使用信号量机制来使msgQSend()不在中断服务程序中执行。通过使用信号量的任务间同步机制来实现这个功能。释放信号量函数semGive()不像msgQSend()那样需要在消息队列中等待,一旦执行就可以马上释放信号量,从而避免了冲突。
由于任务中事件发生有一定间隔,不必选用计数器信号量,所以选用最常用的二进制信号量。首先建立3个先进先出的二进制信号量,设定可调用信号量为空。然后在看门狗定时器的回调函数中使用semGive()函数来释放信号量,重建一个任务在任务起始使用semTake()函数来获取信号量。当获得信号量后,通过msgQSend(,,,WAIT_FOREVER,)函数向消息队列中发送超时消息,而且保证只要消息队列有可用缓冲,就一定可以将消息送出。本文给出一个多重定时器的任务框架,如图3所示。

3.2 主要实现代码
一个三重定时器的主要实现代码如下:

以上程序中通过sysClkRateSet(100)将最小延时单位tick修改成10 ms,它是几个定时时间(30 ms、40 ms、60ms)的最大公约数。通过抓包软件Ethereal抓包,查看发送时间。以30 ms为例,抓包100次的平均定时时间在25 ms左右。出现这种情况的原因是,延时N个tick实际是延时(N-1)tick~N·tick。由于是等可能概率,则它的数学期望是(N+1/2)。对于tick为10 ms,30 ms即N=3,数学期望为25 ms。示意图如图4所示。

延时精度为1/N秒,N越大越精确。于是调用函数synClkRateSet(500),可以使定时的最大误差不超过2 ms。但是如果时钟频率太高,会造成系统在时钟中断处理方面开销太大,影响系统的任务调度,最好通过实验选用较为合适的时钟频率。这里选用sysClkRate-Set(200)。

结 语
本文针对VxWorks下UDP网络通信中的可靠传输问题,提出了一个支持重传和定时等待确认的协议,并利用VxWorks系统提供的信号量同步、消息队列和看门狗定时器等多种机制,综合设计了一种可扩展的三重定时器。针对遇到的具体问题,笔者还进行了一定的优化处理。这种多重定时器模型已在笔者所研究的项目中得到利用,验证了其可行性和相对稳定性。这种多重定时器模型并不完全适合所有环境,需要根据具体情况改进和优化。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top