1.任务队列

vxworks维护4个队列:

  • tick队列
  • ready队列
  • active队列
  • pend队列

一,tick队列

当执行taskDelay时,任务会被延长一段时间执行,此时,任务就会被加入到tick队列中,任务处于Delay状态,无权竞争CPU;

二,ready队列

有资格竞争CPU的队列,按照任务的优先级进行排队,队列头部是优先级最高的任务;

三,active队列

所有任务无论状态如何都会在这个队列中,这个队列维护着系统当前所有的任务,我们通过“i”可以看到所有的任务就是通过遍历active队列来实现的;

四,pend队列

当多个任务竞争一个资源时,如果资源不可得,任务就会被设置为pend状态,进入pend队列中;

函数taskSpawn创建任务,新建任务会放到active队列,此时还不能竞争CPU,taskSpawn最后一步就是把任务放到ready队列中,就可以竞争CPU了。

2.任务优先级

VxWorks共有256个优先级(0~255),0表示优先级最高,255表示优先级最低。taskSpawn创建任务时指定任务优先级,taskPrioritySet可以再创建完成后修改任务优先级。

VxWorks对于应用层任务,推荐使用100~250之间的优先级;驱动层任务,推荐使用51~99之间的任务。

内核网络任务“tNetTask”的任务为50,要是有优先级低于这个,网络收发包就可能受影响。

3.任务上下文

任务的数据结构包含以下内容:

  1. CPU的所有寄存器值,还有任务内存映射空间、任务名称、任务优先级、任务入口函数、信号量、队列;
  2. 存放任务运行时的栈。栈的大小是由创建任务时确定的,此后不允许改变任务栈的大小,如果此任务有许多递归调用,就要申请大的栈空间,防止栈的溢出;
  3. 各种定时信息。系统时钟是系统的脉搏,与高优先级的中断联系。每个Tick,OS都会响应一次中断,这个中断可以作为操作系统调度的触发点;
  4. 信号处理函数,ctrl+c中断当前前台任务。
  5. 其他辅助信息,统计数据等

4.常用任务调度函数

  1. kernelTimeSlice(int ticks) --------------RR调度使能函数
  2. STATUS taskLock(void)和STATUS taskUnlock(void)-------------关闭/开启任务调度,并不禁止中断,是一种互斥机制
  3. taskSpawn创建了任务之后就进入运行状态,taskCreate创建了任务,还要通过taskActivate来激活,才能加入到ready队列中。

5.任务栈

Vxworks的任务栈本质上是内核数据结构的简单保护机制,仅有一个全局变量kernelState来表示是否在内核态。

Vxworks下任务栈即被应用程序使用,也被内核函数使用。

任务栈大小在任务创建时已经确定,在使用时不能修改。这样会引起资源浪费,Vxworks官方文档建议通过试验法,通过checkStack(taskname or id)来查看任务栈的使用情况。

6.任务名

VxWorks可以起任意长度的名字,但是“i”显示任务时,会截断任务名,只显示任务名字的前11B。

“i”最终调用函数taskShow(int tid, int level) /*level:0 = summary, 1 = detals, 2 = all tasks*/

除非自己写函数替换掉