码迷,mamicode.com
首页 > 其他好文 > 详细

基于优先级的抢占式调度及实验的源程序和实验步骤

时间:2015-05-11 23:53:41      阅读:343      评论:0      收藏:0      [点我收藏+]

标签:

基于优先级的抢占式调度及实验的源程序和实验步骤

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

基于优先级的抢占式调度及实验的源程序和实验步骤

标签:

原文地址:http://www.cnblogs.com/daipianpian/p/4495700.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!