VxWorks作为一款优秀的RTOS操作系统,有着优秀的任务切换和中断响应的时间性能 ,有着广泛的使用场景。
VxWorks支持优先级调度和时间片轮转调度。通过tornado提供的windview功能,我们可以通过图示来直观地了解我们应用程序中任务的切换过程。
我们知道VxWorks默认的系统时钟tick为60,即一秒钟被分成了60个tick,我们也可以通过系统函数sysClkRateGet()来获取这个数值,当然我们也可以通过调用系统函数sysClkRateet()来重新设置这个值。
在使用windview的过程中,我发现windview上面的时间轴的单位很奇怪,因此简单写了一段程序来测试其时间轴的单位。
废话不多说,先上代码
#include "vxWorks.h"
#include "stdio.h"
#include "stdlib.h"
#include "semLib.h"
#include "taskLib.h"
#include "sysLib.h"
void taskSend1();
int i = 0;
int tidSend1;
int main(){
tidSend1 = taskSpawn("tSend1",200,0,20000,(FUNCPTR)taskSend1,0,0,0,0,0,0,0,0,0,0);
return;
}
void taskSend1(){
while(1){
printf("\n%d",i++);
taskDelay(sysClkRateGet());}
}
这段代码就是让一个任务执行一次之后,挂起1s钟。
在windview钟taskSend被调用的情况如下图:
这张图片有3个信息值得注意:
- 任务interrupt1是系统时钟中断任务,可以看出,每次系统时钟中断需要耗费2个时间单位来执行,系统时钟中断并不是瞬间完成的,而是需要耗费一些时间。
- 在没有其他任务执行,只有系统时钟中断任务的时候,系统时钟中断任务每3个时间单位就执行一次(即时钟中断每3个时间单位执行一次),从这边其实就可以推断出windview上的3个时间单位等于一个tick的时间,而前面我们知道一个tick是1/60s = 16.67ms,故时间轴的一个时间单位是16.67ms/3 = 5.56ms。
- 我们创建的tSend1任务只需要一个时间单位就可以执行完(从任务调度的角度来说,当某个任务获得执行权的时候,当下的这个时间tick都是属于这个任务的,因此最小时间单位就是一个tick,也许这个任务很简单,还不到一个tick就执行完了)。
继续看一张图,显示tSend1任务的执行间隔,前面通过代码可知,我们设置的是1s 的时间间隔。
可以看出1s = (406-224)~= 180个时间单位。
最后我们可以得出结论:在windview时间轴上 1s = 60 ticks = 180 个时间单位。以后要判断时间轴的单位我们就可以通过观察两次系统时钟中断的时间间隔来计算。