首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Task之任务的控制

Task之任务的控制

作者头像
Taishan3721
发布2019-07-10 15:23:26
9110
发布2019-07-10 15:23:26
举报
文章被收录于专栏:这里只有VxWorks这里只有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里的大部分信息

另外几个就比较简单了,相信只看名字,你就能猜出它们的用法了。

Kernel里还有很多API,虽然不属于taskLib,但是也可以改变任务的状态,咱们以后慢慢再聊。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-12-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 这里只有VxWorks 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档