Chinaunix首页 | 论坛 | 博客
  • 博客访问: 570881
  • 博文数量: 169
  • 博客积分: 2656
  • 博客等级: 少校
  • 技术积分: 1685
  • 用 户 组: 普通用户
  • 注册时间: 2009-07-30 13:03
文章分类

全部博文(169)

文章存档

2011年(1)

2010年(135)

2009年(33)

我的朋友

分类: 嵌入式

2010-05-14 23:53:42

VxWorks是我特别喜欢的一个嵌入式实时操作系统,也曾经用过三四年的时间,只是现在因为工作的关系,接触不到了,还是有点遗憾,前两天说起VxWorks下的定时器使用,又勾起了我使用VxWorks编程的回忆,呵呵,现在就将我对VxWorks定时器使用的一点看法写一下,希望对您有所帮助哦。

VxWorks定时器基本上都依赖于主时钟频率(ticks),因此在开始使用定时器之前最好先得到您所使用的系统里时钟频率(sysClkRateGet())

1、taskDelay,nanosleep

taskdelay()提供了一个简单的任务睡眠机制,也常用于需要定时/延时机制的应用中,函数nanosleep()的功能与taskdelay()类似,nanosleep()允许指定以秒和纳秒为单位的定时/延时时间,taskdelay()以tick作为定时/延时时间。两者只是延时单位不同,而不是精度不同,都由系统时钟频率决定。两者都受到系统任务调度的影响,可以使用taskDelay(0)来将自己放到同优先级的任务队列里,将CPU让给其他相同优先级的任务使用,nanosleep不允许使用0参数。

这种方法只有在VxWorks这样的任务切换迅速的操作系统里使用比较合适,象Linux之类的,因为上下文切换效率不高,需要的指令周期相当多,资源消耗较大,因此不宜使用,且定时准确率也不高,就本人使用情况看,20ms的任务调度,在比较严格的测试环境下,使用taskDelay延时的任务,精度在19.99到20.001之间,大概是二三十微秒吧,这和风河手册上说的13us的反应时间在一个数量级上。因此在VxWorks系统里本人推荐使用此种方法。

2、watchdog

vxworks提供了一个看门狗定时器(watchdog timer)机制,利用提供的函数,任何任务都可以创建一个看门狗定时器,经过指定的延时后,实现在系统时钟isr的上下文中运行指定的程序。在vxworks中,看门狗定时器作为系统时钟中断服务程序的一部分来维护。

因为这种方法运行在系统主时钟终端服务程序的上下文里,因此编程必须符合ISR的规范,至少要做到快速,短小,不能阻塞,可重入之类的,在调用系统函数的时候会有很多限制,不过这种方法应该是某人,某些人最为熟悉的方法吧,就不啰嗦了,呵呵。

3、POSIX IPC

vxworks提供ieee的posix 1003.1b标准定时器接口。使用这种定时器机制,在指定的时间间隔后,任务向自身发信号。定时器是建立在时钟和信号之上。程序可以创建创建、设置和删除一个定时器。当定时器到达期限,将向任务发送默认的信号(sigalrm)。

该方法由于是POSIX的,因此和其他操作系统如Linux对定时器的使用大体类似,如果需要程序移植,该方法为最合适,使用timer的一般流程:

if(timer_create(clock_realtime,0,mytimer)==error)
return(error);

if(timer_connect(mytimer,(voidfuncptr)my_handler,0)==error)
return(error);

if(timer_settime(mytimer,0,value,0)==error)
return(error);
。。。。。。

if (timer_delete(mytimer)==error)
return(error);
在使用定时器时,容易忽略定时结束后任务向自身发信号这一处理步骤。即在定时结束后,要向创建定时器的任务发送信号,如果此时任务已不存在,定时程序将不能执行,提示的错误是“interrupt: timerwdhandler : kill failed (timer=******,tid=******,errno=0x16)”(有一个《关于timer(定时器)中几个函数的疑问!》帖子,其中提到该问题)。在上机时,我设置了一个较长时间的定时器,在创建定时器任务中使用相等的延时操作(taskdelay()、nanosleep()随便哪个都行),此时程序正常运行,定时结束后正确地执行关联到定时器的程序;再次运行,在定时结束前,我在shell下删除掉创建定时器的任务,定时结束后又出现上述的错误。因此,使用posix定时器时,一定要注意不能让创建定时器的任务在触发定时程序之前结束,否则。。。准备reset吧
4、其他

使用带有超时值timeout的msgqreceive()、semtask()也可以实现延时,不推荐使用,在某些特定场合,如果需要使用到这些函数,可以配合使用。

阅读(3812) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~