基于优先级的抢占式调度及实验的源程序和实验步骤
1 实验目的
1.学习并验证基于优先级的抢占式调度
2 实验内容
在实验一建立的 project 中,创建3 个任务,对这三个任务使用基于优先级的抢占式调度。观察运行结果。
3 实验设备及工具
1.硬件:
a) PC 机
2.软件:
a) PC 机操作系统Windows2000 或windowsXP
b) Tornado2.2
4 实验原理
Wind 内核调度默认使用基于优先级抢占式调度。每个任务有一个优先级,任一时刻,内核保证将CPU 分配给处于就绪状态的优先级最高的任务执行。之所以说这种调度算法是抢占的,是因为,如果在某个时刻,一个优先级比当前正在运行的任务的优先级高的任务变为就绪,那么内核立即保存当前任务的上下文,然后切换到这个最高优先级任务的上下文。
Wind 内核有256 个优先级(0~255),优先数0 对应着最高优先级,优先数
255 对应着最低优先级。任务的优先级在其创建时指定,VxWorks 也允许任务在
执行时调用taskPrioritySet()改变自身的优先级。
函数 taskSpawn()用于创建并激活一个新任务。其原型如下:
当有多个不同优先级的任务时,任务的优先级才有意义。任务在执行时可以
调用下面的函数改变自身的优先级:
下面的例子创建三个优先级各不相同的任务。
5 实验步骤
1.编程(假设编写的源文件为s6_hisched.c)
2.将s6_hisched.c 添加到project 中
3.编译(如果有错误,则改正)
4.下载到VxSim 模拟器上运行,观察输出。
5.修改程序,使得任务的执行顺序变为:taskOne,taskTwo,taskThree。观
察输出。
6.修改程序,使得taskOne 具有最高优先级,同时taskTwo 也以同样的由县
级运行,观察输出结果。
6 实验报告要求
1.写出实验过程
2.记录输出结果。分析4~6 步骤的结果。
3.附上源程序(修改前和修改后)
源程序及实验步骤
优先级修改前的源程序及实验步骤
1 #include "vxworks.h" 2 #include "taskLib.h" 3 #include "logLib.h" 4 5 #define ITER1 10 6 #define ITER2 1 7 #define LONG_TIME (1<<25) 8 #define HIGH 100 9 #define MID 101 10 #define LOW 102 11 12 static void taskOne(void) 13 { 14 int i,j; 15 for (i=0;i<ITER1;i++){ 16 for (j=0;j<ITER2;j++) 17 logMsg("\n",taskIdSelf(),0,0,0,0,0); 18 for (j=0;j<LONG_TIME;j++); 19 } 20 } 21 22 static void taskTwo(void) 23 { 24 int i,j; 25 for (i=0;i<ITER1;i++){ 26 for (j=0;j<ITER2;j++) 27 logMsg("\n",taskIdSelf(),0,0,0,0,0); 28 for (j=0;j<LONG_TIME;j++); 29 } 30 } 31 32 static void taskThree(void) 33 { 34 int i,j; 35 for (i=0;i<ITER1;i++){ 36 for (j=0;j<ITER2;j++) 37 logMsg("\n",taskIdSelf(),0,0,0,0,0); 38 for (j=0;j<LONG_TIME;j++); 39 } 40 } 41 42 void s6_hisched(void) 43 { 44 int taskIdOne, taskIdTwo, taskIdThree; 45 logMsg("\n\n\n\n\n",0,0,0,0,0,0); 46 if ((taskIdOne=taskSpawn("task1",LOW,0x100,20000, 47 (FUNCPTR)taskOne,0,0,0,0,0,0,0,0,0,0))==ERROR) 48 logMsg("taskSpawn taskOne failed.\n",0,0,0,0,0,0); 49 if ((taskIdTwo=taskSpawn("task2",MID,0x100,20000, 50 (FUNCPTR)taskTwo,0,0,0,0,0,0,0,0,0,0))==ERROR) 51 logMsg("taskSpawn taskTwo failed.\n",0,0,0,0,0,0); 52 if ((taskIdThree=taskSpawn("task3",HIGH,0x100,20000, 53 (FUNCPTR)taskThree,0,0,0,0,0,0,0,0,0,0))==ERROR) 54 logMsg("taskSpawn taskThree failed.\n",0,0,0,0,0,0); 55 }
由上图可知:修改前执行的先后顺序为taskThree,taskTwo,taskOne
优先级修改后的源程序及实验步骤
1 #include "vxworks.h" 2 #include "taskLib.h" 3 #include "logLib.h" 4 5 #define ITER1 10 6 #define ITER2 1 7 #define LONG_TIME (1<<25) 8 #define HIGH 100 9 #define MID 101 10 #define LOW 102 11 12 static void taskOne(void) 13 { 14 int i,j; 15 for (i=0;i<ITER1;i++){ 16 for (j=0;j<ITER2;j++) 17 logMsg("\n",taskIdSelf(),0,0,0,0,0); 18 for (j=0;j<LONG_TIME;j++); 19 } 20 } 21 22 static void taskTwo(void) 23 { 24 int i,j; 25 for (i=0;i<ITER1;i++){ 26 for (j=0;j<ITER2;j++) 27 logMsg("\n",taskIdSelf(),0,0,0,0,0); 28 for (j=0;j<LONG_TIME;j++); 29 } 30 } 31 32 static void taskThree(void) 33 { 34 int i,j; 35 for (i=0;i<ITER1;i++){ 36 for (j=0;j<ITER2;j++) 37 logMsg("\n",taskIdSelf(),0,0,0,0,0); 38 for (j=0;j<LONG_TIME;j++); 39 } 40 } 41 42 void s6_hisched(void) 43 { 44 int taskIdOne, taskIdTwo, taskIdThree; 45 logMsg("\n\n\n\n\n",0,0,0,0,0,0); 46 if ((taskIdOne=taskSpawn("task1",HIGH,0x100,20000, 47 (FUNCPTR)taskOne,0,0,0,0,0,0,0,0,0,0))==ERROR) 48 logMsg("taskSpawn taskOne failed.\n",0,0,0,0,0,0); 49 if ((taskIdTwo=taskSpawn("task2",MID,0x100,20000, 50 (FUNCPTR)taskTwo,0,0,0,0,0,0,0,0,0,0))==ERROR) 51 logMsg("taskSpawn taskTwo failed.\n",0,0,0,0,0,0); 52 if ((taskIdThree=taskSpawn("task3",LOW,0x100,20000, 53 (FUNCPTR)taskThree,0,0,0,0,0,0,0,0,0,0))==ERROR) 54 logMsg("taskSpawn taskThree failed.\n",0,0,0,0,0,0); 55 }
由上图可知:修改后执行的先后顺序为taskOne,taskTwo,taskThree