基于VxWorks操作系统的通用定时器设计
定时器。该函数首先从定时节点链表中获取一个空闲节点,然后根据要添加的定时节点参数初始化该节点,最后将该节点重新添加到链表中。其中,函数参数val为所要定时的时间,pFunc为定时到之后要执行的函数,arg为pFunc的参数,sem为定时时间到后要释放的信号量,函数返回值为定时节点的ID号。需要注意的是,当节点链表不为空时要开启辅助时钟。
定时节点删除函数TimerCanele(int ID)主要用于取消一个激活的定时节点,该函数的传输参数为要取消的定时节点ID。
定时模块销毁函数ComTimerDes()主要用于从系统中销毁定时模块,包括删除信号量、释放链表内存。
辅助时钟中断服务程序AuxClkSvr()是实现精确定时的基础,其通过函数sysAuxClkConnect()连接到辅助时钟中断上。为保证定时精确性,应使此中断程序最短执行。为此建立有序的定时节点链表,每次中断时只需从链表节点首开始遍历找到第一个未休眠的节点,然后将该节点的timeLeft减1,若此时timeLeft为0,则释放中断处理任务的同步信号量;另外,为使得辅助时钟的中断次数最小,可将辅助时钟的分辨率precision设为所需定时任务定时时间的最大公约数,从而函数TimerIncrease()的参数val为所需定时时间与precision的倍数。此函数的执行过程如图2。
中断处理任务TimerSvrTask()主要用来处理已经到时的节点。该任务生成后等待同步信号量,如果获得该信号量,则从传递来的第一个节点开始遍历所有timeLeft为0的节点,然后执行节点对应的函数或者释放节点对应的信号量,最后再根据到时节点的timerType判断:若该定时节点为单次则把该节点设为不可用;若该定时节点为周期性的,则先将该节点从链表中取出,重新初始化剩余时间后再次插入链表中的恰当位置。
需要说明的是,基于辅助时钟的通用定时器需要CPU的一个时钟资源,且辅助时钟的使用会和调试工具SpyChart冲突,使用时应特别注意。
3 数据访问的防冲突考虑
由于定时节点链表以及程序中用到的其它全局变量相对所有的任务都是共享数据,因此为保持数据使用的一致性,需要加以保护,以防止多个任务对共享数据的使用冲突。对于有辅助时钟中断服务程序参与的数据,例如链表,其他任务在对链表操作前需要先禁止中断,操作完毕后再允许中断,以防出现中断与任务的不一致问题;对于辅助时钟中断服务程序不参与的数据,各任务对它的访问采用互斥信号量方式即可。
4 结束语
当前,基于辅助时钟的通用定时器已在某无人机发射装置中的强实时命令传递、通讯数据帧收发以及目标系统状态监控方面得到了应用,满足了毫秒级的单次和周期交叉定时要求,效果良好。该定时器机制对所用接口进行了封装,使其具有了较好的继承性和扩展性,为今后此类系统中的精确定时需求提供了方便。
- 蓝牙无线耳机设计及VxWorks移植方法(07-21)
- 军事指挥系统中VxWorks下汉字显示技术(07-16)
- 基于VxWorks的文件系统的研究与实现(09-18)
- 嵌入式语音通信系统中VxWorks BSP的设计实现(09-18)
- 嵌入式系统的VxWorks安全性问题研究(11-06)
- VxWorks下的多重定时器设计(02-16)