Vxworks系统学习----任务

转载地址:http://blog.csdn.net/blueoceanindream/article/details/7573818


1.任务队列

vxworks维护4个队列:

tick队列

ready队列

active队列

pend队列

一,tick队列

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

二,ready队列

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

三,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)来查看任务栈的使用情况。


发布了27 篇原创文章 · 获赞 19 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/muaxi8/article/details/52063958
今日推荐