关 闭

新闻中心

EEPW首页 > 工控自动化 > 设计应用 > VxWorks下的异步通用定时器设计

VxWorks下的异步通用定时器设计

作者:时间:2009-12-15来源:网络收藏


1 概 述
是WindRiver公司开发的高性能实时嵌入式操作系统内核。在应用软件开发过程中经常会用到下要实现定时功能有2个途径:一,借助taskDelay函数实现;二,使用提供的看门狗(watchdog)。使用taskDelay函数实现的缺点在于它是基于任务的,任务优先级会导致定时不准。看门狗基于系统时钟中断,定时精度大大优于前者,但是对用户的回调函数有诸多限制(如不允许使用semTake、printf等需要等待获取某种资源的函数,否则会引起死机)。另外,看门狗只触发一次回调函数,如果用户需要周期就需要重新启动看门狗。
本文了基于看门狗机制的定时器,并根据实际需要了周期性定时和一次性定时两种定时器。是指定时器运行于任务中,对用户没有任何限制。定时器提供类似于Windows下定时器的操作接口,简单、方便。

本文引用地址:http://www.eepw.com.cn/article/163412.htm


2 VxWorks下的看门狗
VxWorks提供看门狗机制,允许将希望若干时间延迟后执行的用户函数连接到看门狗,在定时时间到达后由看门狗自动执行。看门狗机制由操作系统维持在系统时钟中断,连接到看门狗的函数同样运行在系统时钟中断服务程序中。如果操作系统由于种种原因(如在系统时钟中断前的中断或者内核状态),将不能立即执行的函数存放在tExcTask任务的队列中,则队列中的函数将以tExc-Task任务的优先级运行(通常为0)。操作系统对中断服务程序的各种限制同样适用于连接到看门狗的用户函数,如不能使用printf、semTake等。
对看门狗的操作函数有4个:创建看门狗函数,WDOGID wdCreate(void);启动看门狗函数,STATUS wdStart(WDOG_ID wdId,int delay,FUNCPTR pRoutine,intparameter);删除看门狗函数,STATUS WdDelete(WDOG_ID wdld);取消看门狗计时函数,STATUS wdCancel(WDOG_ID wdld)。
看门狗的简单使用如下:


首先创建看门狗,然后在启动看门狗时连接用户函数并设置延迟时间。上面程序中的interval即为延迟时间,单位为系统时钟的tick数。缺省情况下,系统时钟每秒的tick数为60。当interval为1时,即延迟1/60 s后执行usrFunc。系统时钟的tick数可以通过sysClkRateSet函数设置。


3 异步定时器的
3.1 设计思想
虽然看门狗提供的定时机制相对简单易用,但还有许多局限性:①定时时间的单位为tick数,而不是通常使用的s或者ms。②用户函数运行在系统时钟中断服务程序中,而不是运行在任务的上下文中。这给用户函数带来许多限制(比如用户函数中不能使用内存分配、获取信号量、printf打印输出等),在这些限制下某些功能可能就无法实现。③看门狗的触发是一次性的,而通常需要周期性的定时器。④相对于Windows下的定时器接口,看门狗接口不够简洁明了。异步通用定时器的设计基于看门狗,并在此基础上做进一步的封装,提供类似于Windows的使用方式。系统时钟每秒的tick数可以通过sysClkRateSet函数设置,一般设置为1 000,即每个tick代表1 ms。这样就可以提供分辨率为ms级的定时器,对大多数应用而言可以满足使用要求。每个定时器对应一个看门狗,同时对应一个任务,使得用户函数运行在任务中,而不是在中断中,这样可以避免操作系统对中断处理函数的种种限制。具体的做法是:在生成定时器时,启动看门狗开始定时,同时创建一个任务等待一个计数信号量(该信号量初始为空,任务处于PEND状态);当定时时间到达时看门狗释放该信号,激活任务,在任务中调用用户函数。这样做的优点在于,提高了效率,减轻了负载,减少了中断中的运算(仅仅是释放信号量);尽管多创建了一个任务,但是在定时器没有触发时任务仍处于PEND状态,对资源占用很小。


上一页 1 2 3 下一页

评论


相关推荐

技术专区

关闭