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.任务上下文
任务的数据结构包含以下内容:
- CPU的所有寄存器值,还有任务内存映射空间、任务名称、任务优先级、任务入口函数、信号量、队列;
- 存放任务运行时的栈。栈的大小是由创建任务时确定的,此后不允许改变任务栈的大小,如果此任务有许多递归调用,就要申请大的栈空间,防止栈的溢出;
- 各种定时信息。系统时钟是系统的脉搏,与高优先级的中断联系。每个Tick,OS都会响应一次中断,这个中断可以作为操作系统调度的触发点;
- 信号处理函数,ctrl+c中断当前前台任务。
- 其他辅助信息,统计数据等
4.常用任务调度函数
- kernelTimeSlice(int ticks) --------------RR调度使能函数
- STATUS taskLock(void)和STATUS taskUnlock(void)-------------关闭/开启任务调度,并不禁止中断,是一种互斥机制
- 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*/
除非自己写函数替换掉