泰安网站建设dxkjw,制作游戏需要什么技术,网页设计实训总结和体会,在线网页代理器1 taskDelay taskdelay()提供了一个简单的任务睡眠机制#xff0c;也常用于需要定时/延时机制的应用中。
它的格式是 STATUS taskDelay(int ticks /* number of ticks to delay task */ )#xff0c;
可以看出使用该函数实现延时的单位为tick#xff08;一般系统中一个…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 timerPOSIX 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******,errno0x16)”有一个《关于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