1 taskDelay
taskdelay()提供了一个简单的任务睡眠机制,也常用于需要定时/延时机制的应用中。

它的格式是 STATUS taskDelay(int ticks   /* number of ticks to delay task */   ),

可以看出使用该函数实现延时的单位为tick(一般系统中一个tick都是ms级的)。

在VxWorks下可以这样使用taskDelay()函数:  taskDelay(sysClkRateGet()*1)。

函数sysClkRateGet()返回系统的时钟速率,单位是tick数/每秒(利用函数sysClkRateSet()可以改变系统的时钟速率)。在POSIX中有一个与taskdelay()相对应的函数――nanosleep()(下文中有介绍)。这两个函数仅仅是延时单位不同,效果是相同的。
利用taskdelay(),可以将调用的任务移动到具有相同优先级的就绪队列尾部。特别的,可以通过调用taskdelay(0),将cpu交给系统中其他相同优先级的任务。延时为0的调用只能用于taskdelay()中,nanosleep()认为这种调用是错误的。
taskdelay()会导致调用的任务在指定的延时期间(以ticks计数)放弃cpu,使任务处于DELAY状态(因此,其不能用于中断服务程序中)。通常其受到任务调度的影响,但在等待一些与中断无关联的外部条件时,其是有用的。如果调用的任务受到一个信号,指出其没有被阻塞或被忽略,taskDelay()将返回ERROR,并在信号处理程序运行后设置errno为EINTR。
2 WatchDog
VxWorks提供了一个看门狗定时器(watchdog timer)机制,利用提供的函数,任何任务都可以创建一个看门狗定时器,经过指定的延时后,实现在系统时钟ISR的上下文中运行指定的程序。在VxWorks中,看门狗定时器作为系统时钟中断服务程序的一部分来维护。函数因此,与看门狗定时器相联系的运行在系统时钟中断级。在使用看门狗定时器实现定时/延时时,经过指定的时间,应用程序中断在系统时钟中断优先级上面,然而,如果内核不能立即执行这个中断服务程序,这个任务就被排队到tExcTask 工作队列中去,处在 tExcTask 工作队列中的任务的优先级为 tExcTask (通常是 0)。对于使用看门狗定时器的中断服务程序,仍然必须遵守一般的ISR所要遵守的规则。
通过wdCreate( )可以创建一个看门狗定时器。调用wdStart()启动定时器,延时参数以tick为单位,同时还要指定定时完成后要调用的程序。如果你的应用程序需要多个看门狗函数,使用wdCreate( )为每个需求产生独立的看门狗ID。因为对于给定的看门狗ID,只有最近的wdStart()有效。在指定的tick计数到达之前,要取消一个看门狗计时器,可以调用wdCancel()实现。
每调用一次wdStart(),看门狗定时器只执行一次。对于一些要求周期性执行的应用程序。要获得该效果,定时器函数本身必须通过递归调用wdStart()来重新启动定时器。
利用看门狗定时器,调用的任务不会被阻塞:因为wdStart()调用是立即返回的。使用该方法实现延时,关联函数所受限制太大,好多系统调用不可用,郁闷也…
3 timer(POSIX)
3.1 timer
VxWorks提供IEEE的POSIX 1003.1b标准定时器接口。使用这种定时器机制,在指定的时间间隔后,任务向自身发信号。定时器是建立在时钟和信号之上。
程序可以创建创建、设置和删除一个定时器。当定时器到达期限,将向任务发送默认的信号(SIGALRM)。
使用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吧
3.2 nanosleep()
函数nanosleep()的功能与VxWorks提供的taskDelay()类似,nanosleep()允许指定以秒和纳秒为单位的定时/延时时间,taskDelay()以tick作为定时/延时时间。两者只是延时单位不同,而不是精度不同,都由系统时钟频率决定。与taskDelay()一样,使用nanosleep()实现定时/延时的任务也受调度的影响,在实际操作中一定要注意这一点。
使用nanosleep()时,定时参数使用的是结构itimerspe中的it_value,可以指定it_value中的秒和纳秒为定时/延时时间。函数的使用较为简单,不再赘述。

4 其它
使用带有超时值timeout的msgQReceive()、semTask()也可以实现延时(有使用这种方式来进行延时的人吗?不有吗?有吗?不有吗?有吗?不有吗?。。。)。
该方法将阻塞任务,让其等待超时,利用该方法实现延时可以使用函数semTask(…,timeout)、msgQReceive(…,…,…,timeout)。调用任务被放进阻塞队列中(注意,使用semTask和msgQReceive时,time的值不能是NO_WAIT,如果指定NO_WAIT的话,将立即返回,也就达不到延时的效果了^_^)。如果你希望任务不被阻塞,还能继续执行,sorry,此法不行,使用看门狗吧。
当阻塞的任务满足继续执行的条件后,将被放入ready队列。这里要注意的是,任务被放入ready队列并不意味着立刻就被执行。想想看,如果比它高优先级的任务正在占用资源,或也在等资源,那么…延时将是不确定的。

新代码定时器采用 3、timer

VxWorks下几种定时延时方法的小结相关推荐

  1. keil c语言 延迟程序,Keil C51程序设计中几种精确延时方法

    前几天时间在做一个基于51单片机开发板的等精度频率计,用LCD1602液晶显示的,晶振是22.1184MHZ,用得是测频率法,目的是想做到能够测试0--900KHZ的信号. 液晶显示部分花了我好几天才 ...

  2. .Net下几种日志管理方法

    .Net下几种日志管理方法 日志是应用程序中不可缺少的一部份,不仅可以记录应用程序的运行状态,还可以记录一些BUG,便于应用程序的更新与修改. 在.Net有好几种方法可以对日志进行管理. 1.数据库日 ...

  3. keil延时c语言程序设计,Keil C51程序设计中几种精确延时方法

    引言 单片机因具有体积小.功能强.成本低以及便于实现分布式控制而有非常广泛的应用领域[1].单片机开发者在编制各种应用程序时经常会遇到实现精确延时的问题,比如按键去抖.数据传输等操作都要在程序中插入一 ...

  4. c51语言1秒延时程序,KeilC51程序设计中几种精确延时方法

    实现延时通常有两种方法: 一种是硬件延时,要用到定时器/计数器,这种方法可以提高CPU的工作效率,也能做到精确延时:另一种是软件延时,这种方法主要采用循环体进行. 1 使用定时器/计数器实现精确延时 ...

  5. mysql 反弹shell_Linux下几种反弹Shell方法的总结与理解

    *本文原创作者:LlawLiet,本文属FreeBuf原创奖励计划,未经许可禁止转载. 之前在网上看到很多师傅们总结的linux反弹shell的一些方法,为了更熟练的去运用这些技术,于是自己花精力查了 ...

  6. VxWorks下一种解决Telnet 23端口的挂住方法

    问题: 1.在TSP上运行的主机程序,如果通过telnet去监察程序的运行情况.如果没有正常关闭连接,则有时超过2小时之后,则会话丢失,再连接时,会出现"Sorry, session lim ...

  7. Windows下的自动定时执行方法 - 定时执行专家

    [正文] 一.软件简介 <定时执行专家>是一款制作精良.功能全面.使用简单的专业定时执行工具软件.支持 18 种任务类型,11 种任务触发方式(包含 Cron方式),触发精度达到" ...

  8. linux下几种反弹Shell方法的总结与理解

    实验环境 CentOS 6.5:192.168.0.3 kali2.0:192.168.0.4 方法1: 反弹shell命令如下: bash -i >& /dev/tcp/ip/port ...

  9. windows下tomcat自动定时重启方法

    出处:http://blog.sina.com.cn/s/blog_4b78098001015eoi.html 1,首先将tomcat注册为服务,先打开tomcat的bin目录下service.bat ...

最新文章

  1. mysql 源头锁,mysql 使用手册 - 追梦,一个伟大程序员的源头。 - OSCHINA - 中文开源技术交流社区...
  2. hdu 1548 A strange lift
  3. Scala教程之:Scala基础
  4. css之去除html标签默认的外边距margin和内边距padding,通用工具类 base.css
  5. 10以内数的组成分解图_大班数学教案《10以内数的组成》
  6. 在.NET Core中用最原生的方式读取Nacos的配置
  7. Symbol MC1000 扫描 冲突问题 把下面文件做成scanwedge.reg的注册表文件,放在Application重起
  8. android 开源_Android开源如何使其成为移动市场的领导者
  9. ArcGISTiledMapServiceLayer does not support Multi-Layer Caches
  10. python如何设置api接口_python如何使用api接口
  11. c语言sqart函数格式,2019-07-29 复习C语言入门知识
  12. 学习太极创客 — ESP8226 (二)
  13. [生命科学] snapgene 构建载体方法分享
  14. 坚果手机2系统相册问题
  15. ros学习(2-2):ros节点创建(python)
  16. DayDayUp:心灵鸡汤之天空飘来五个字~那都不是事(一问一答告诉你什么是高层次的认知)
  17. 在买了38台件米家智能家居后,告诉你米家什么不值得买
  18. 透过Python 将接收邮件邮件进行分类统计
  19. FIND_IN_SET函数
  20. 量子计算机芯片电原理图,量子计算机新进展:量子光学芯片电路

热门文章

  1. String类中不同拼接方式
  2. 分布式队列编程:模型、实战
  3. c语言see函数,vprintf() - C语言库函数
  4. 太阳光是平行光吗_“彩虹的形成是因为光的色散和光沿直线传播是一回事吗?”...
  5. 【OS学习笔记】一 处理器、内存和指令
  6. 【移植驱动到Linux3.4.2内核之二】LCD,触摸屏,按键,USB等驱动程序的移植心得总结
  7. 位运算 中度难度 子集
  8. 关注:Eclipse,转贴eclipse CDT的开发文章
  9. 高可用-软件heartbeat的入门介绍
  10. Laravel框架一:原理机制篇