小编给大家分享一下vxworks中如何控制任务,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!
任务被taskSpawn()创建或taskActivate()激活后,直接进入Ready队列。但实际运行时,任务大部分时间处于其它状态,并不是Ready态,不然CPU的占用率就很高了,功耗也就上去了,那肯定是软件架构的设计出问题了。
VxWorks的taskLib库里关于控制任务状态的一些函数
taskSuspend()是将任务放到Suspend队列,taskResume()是将任务放到Ready队列,这两个API通常只是在调试时才会使用。taskSuspend(0)就是挂起任务本身,就像我们在《Task之常见系统任务》里观察tRootTask时所作的。不过taskResume(0)就是无效操作了,想想为啥?
taskRestart()的主要作用是重启发生严重错误的任务。既然它只有一个参数,说明重启的任务使用的是原有的属性,包括ID、优先级、选项、入口地址、栈尺寸。其中优先级和选项可能被动态改变过,那就使用最新的值。
taskDelay()通常用在轮询操作之中,它会让当前任务进入Delay队列,期限到时之后,再返回Ready队列中同优先级任务的尾部。其参数单位是tick,也就是系统时钟的频率。例如delay两秒,通常这样写:
sysClkRateGet()的作用就是返回系统时钟每秒钟的tick数。每个VxWorks版本的系统时钟频率默认都是60,但taskDelay(120),不一定是Delay两秒。因为可以通过sysClkRateSet()修改时钟频率
要注意的是,每个tick到来时,都会触发系统时钟中断,所以不建议把系统时钟频率设置得太快,否则会降低系统性能。
taskDelay()的参数是整型值,所以使用时要注意整除的问题。例如,使用默认的系统时钟频率时,就不可能精确延时1/7秒。
sysClkRateGet()/7 = 60/7 = 8,8个tick,只是8/60秒了。
当taskDelay()的参数为0时,任务并不会进入Delay状态,而是直接把CPU让给同优先级的任务(如果有的话),自己排到同优先级任务的尾部,这就相当于Linux系统的sched_yield()操作。
我们在《Task之任务的创建》里提到过,使用taskPriorityGet()/taskPrioritySet(),可以查询/调整任务的优先级。另外还有几个API可以查询任务的状态信息
从名字就可以看出来taskInfoGet()最为强大,它可以获得TCB里的大部分信息
以上是“vxworks中如何控制任务”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。