3948|4

57

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

关于vxworks轮转调度 [复制链接]

 下面是《vxworks与tornado》的例子:
#define PRIORITY 50
#define TIMESFLICE (float)sysClkRateGet()/100
void sched(void)
{
        int taskIdOne, taskIdTwo, taskIdThree;
       int i, j;

        if(kernelTimeSlice(TIMESLICE) == OK)
                printf("\n\n\n\n\t\t\tTIMESLICE = %f secondes\n\n\n", TIMESLICE/60);
        else
                printf("\n\n\n\n\t\t\tTIMESLICE SET ERROR!\n\n\n");

        if((taskIdOne =
                taskSpawn("task1", PRIORITY, 0x100, 2000, taskOne,
                   0,0,0,0,0,0,0,0,0,0)) == ERROR);
              printf("taskSpawn taskOne failed\n");
                  
        if((taskIdTwo =
                taskSpawn("task2", PRIORITY, 0x100, 2000, taskTwo,
                   0,0,0,0,0,0,0,0,0,0)) == ERROR);
              printf("taskSpawn taskTwo failed\n");

        if((taskIdThree =
                taskSpawn("task3", PRIORITY, 0x100, 2000, taskThree,
                   0,0,0,0,0,0,0,0,0,0)) == ERROR);
              printf("taskSpawn taskThree failed\n");


        for(i = 0;i < ITER1;i++)
        {
                for(j = 0; j < ITER2; j++)
                        logMsg("\n", 0, 0, 0, 0, 0, 0);
                for(j = 0; j < LONG_TIME; j++);
        }                  
}
sched的优先级为100,taskSpawn出来的任务的优先级都是50,实现轮转调度,发现放在sched代码后的循环语句还是在新建的三个任务前运行。
轮转调度不是先运行高优先级的任务吗?以为sched中的循环语句应该在所有新建任务完成后在执行的,请高手指教。

最新回复

顶贴,学习中,愿高手指点迷津。  详情 回复 发表于 2009-1-20 13:24
点赞 关注
 

回复
举报

74

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
有两个问题:
1.你怎么确定“放在sched代码后的循环语句还是在新建的三个任务前运行”?是在你创建的task里面加打印?

2.logMsg本身通过消息队列实现,也就是说对logMsg的调用本身就是通过向另外一个任务tLogTask发送消息,通过tLogTask输出到屏幕的。


有时侯看到的并不是真实的。
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
taskSpawn就是一个任务切换点,肯定是进行了切换。我也有同样的问题,task里面里面做什么了?

上面高手说的没错,logMsg为了保证在中断中可以调用,都是同一发给tLogTask任务来进行输出的。

最简单的方式,可以在内存中记录当前的cputick值看看。
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

4
 
这个代码运行起来一直没有看到理论中的那种task1,task2,task3轮流运行一段时间的效果:

  1. #include "vxWorks.h"
  2. #include "taskLib.h"
  3. #include "kernelLib.h"
  4. #include "sysLib.h"
  5. #include "logLib.h"

  6. void taskOne(void);
  7. void taskTwo(void);
  8. void taskThree(void);

  9. #define ITER1 5
  10. #define ITER2 10
  11. #define PRIORITY 50
  12. #define TIMESLICE (float)sysClkRateGet()/100
  13. #define LONG_TIME 1000000

  14. void sched(void)
  15. {
  16.         int taskIdOne, taskIdTwo, taskIdThree;
  17.        int i, j;

  18.         if(kernelTimeSlice(TIMESLICE) == OK)
  19.                 printf("\n\n\n\n\t\t\tTIMESLICE = %f secondes\n\n\n", TIMESLICE/60);
  20.         else
  21.                 printf("\n\n\n\n\t\t\tTIMESLICE SET ERROR!\n\n\n");

  22.         if((taskIdOne =
  23.                 taskSpawn("task1", PRIORITY, 0x100, 2000, taskOne,
  24.                    0,0,0,0,0,0,0,0,0,0)) == ERROR);
  25.               printf("taskSpawn taskOne failed\n");
  26.                   
  27.         if((taskIdTwo =
  28.                 taskSpawn("task2", PRIORITY, 0x100, 2000, taskTwo,
  29.                    0,0,0,0,0,0,0,0,0,0)) == ERROR);
  30.               printf("taskSpawn taskTwo failed\n");

  31.         if((taskIdThree =
  32.                 taskSpawn("task3", PRIORITY, 0x100, 2000, taskThree,
  33.                    0,0,0,0,0,0,0,0,0,0)) == ERROR);
  34.               printf("taskSpawn taskThree failed\n");

  35.           
  36. }

  37. void taskOne(void)
  38. {
  39.         int i, j;
  40.         for(i = 0;i < ITER1;i++)
  41.         {
  42.                 for(j = 0; j < ITER2; j++)
  43.                         logMsg("\n", 0, 0, 0, 0, 0, 0);
  44.                 for(j = 0; j < LONG_TIME; j++);
  45.         }
  46. }

  47. void taskTwo(void)
  48. {
  49.         int i, j;
  50.         for(i = 0;i < ITER1;i++)
  51.         {
  52.                 for(j = 0; j < ITER2; j++)
  53.                         logMsg("\n", 0, 0, 0, 0, 0, 0);
  54.                 for(j = 0; j < LONG_TIME; j++);
  55.         }
  56. }

  57. void taskThree(void)
  58. {
  59.         int i, j;
  60.         for(i = 0;i < ITER1;i++)
  61.         {
  62.                 for(j = 0; j < ITER2; j++)
  63.                         logMsg("\n", 0, 0, 0, 0, 0, 0);
  64.                 for(j = 0; j < LONG_TIME; j++);
  65.         }
  66. }
复制代码

运行结果如下:






  1.                         TIMESLICE = 0.010000 secondes


  2. taskSpawn taskOne failed
  3. taskSpawn taskTwo failed
  4. taskSpawn taskThree failed
  5. 0x3868de8 (task1):
  6. 0x3868de8 (task1):
  7. 0x3868de8 (task1):
  8. 0x3868de8 (task1):
  9. 0x3868de8 (task1):
  10. 0x3868de8 (task1):
  11. 0x3868de8 (task1):
  12. 0x3868de8 (task1):
  13. 0x3868de8 (task1):
  14. 0x3868de8 (task1):
  15. 0x3868de8 (task1):
  16. 0x3868de8 (task1):
  17. 0x3868de8 (task1):
  18. 0x3868de8 (task1):
  19. 0x3868de8 (task1):
  20. 0x3868de8 (task1):
  21. 0x3868de8 (task1):
  22. 0x3868de8 (task1):
  23. 0x3868de8 (task1):
  24. 0x3868de8 (task1):
  25. 0x3868de8 (task1):
  26. 0x3868de8 (task1):
  27. 0x3868de8 (task1):
  28. 0x3868de8 (task1):
  29. 0x3868de8 (task1):
  30. 0x3868de8 (task1):
  31. 0x3868de8 (task1):
  32. 0x3868de8 (task1):
  33. 0x3868de8 (task1):
  34. 0x3868de8 (task1):
  35. 0x3868de8 (task1):
  36. 0x3868de8 (task1):
  37. 0x3868de8 (task1):
  38. 0x3868de8 (task1):
  39. 0x3868de8 (task1):
  40. 0x3868de8 (task1):
  41. 0x3868de8 (task1):
  42. 0x3868de8 (task1):
  43. 0x3868de8 (task1):
  44. 0x3868de8 (task1):
  45. 0x3868de8 (task1):
  46. 0x3868de8 (task1):
  47. 0x3868de8 (task1):
  48. 0x3868de8 (task1):
  49. 0x3868de8 (task1):
  50. 0x3868de8 (task1):
  51. 0x3868de8 (task1):
  52. 0x3868de8 (task1):
  53. 0x3868de8 (task1):
  54. 0x3868de8 (task1):
  55. 0x3865268 (task2):
  56. 0x3865268 (task2):
  57. 0x3865268 (task2):
  58. 0x3865268 (task2):
  59. 0x3865268 (task2):
  60. 0x3865268 (task2):
  61. 0x3865268 (task2):
  62. 0x3865268 (task2):
  63. 0x3865268 (task2):
  64. 0x3865268 (task2):
  65. 0x3865268 (task2):
  66. 0x3865268 (task2):
  67. 0x3865268 (task2):
  68. 0x3865268 (task2):
  69. 0x3865268 (task2):
  70. 0x3865268 (task2):
  71. 0x3865268 (task2):
  72. 0x3865268 (task2):
  73. 0x3865268 (task2):
  74. 0x3865268 (task2):
  75. 0x3865268 (task2):
  76. 0x3865268 (task2):
  77. 0x3865268 (task2):
  78. 0x3865268 (task2):
  79. 0x3865268 (task2):
  80. 0x3865268 (task2):
  81. 0x3865268 (task2):
  82. 0x3865268 (task2):
  83. 0x3865268 (task2):
  84. 0x3865268 (task2):
  85. 0x3865268 (task2):
  86. 0x3865268 (task2):
  87. 0x3865268 (task2):
  88. 0x3865268 (task2):
  89. 0x3865268 (task2):
  90. 0x3865268 (task2):
  91. 0x3865268 (task2):
  92. 0x3865268 (task2):
  93. 0x3865268 (task2):
  94. 0x3865268 (task2):
  95. 0x3865268 (task2):
  96. 0x3865268 (task2):
  97. 0x3865268 (task2):
  98. 0x3865268 (task2):
  99. 0x3865268 (task2):
  100. 0x3865268 (task2):
  101. 0x3865268 (task2):
  102. 0x3865268 (task2):
  103. 0x3865268 (task2):
  104. 0x3865268 (task2):
  105. 0x38616e8 (task3):
  106. 0x38616e8 (task3):
  107. 0x38616e8 (task3):
  108. 0x38616e8 (task3):
  109. 0x38616e8 (task3):
  110. 0x38616e8 (task3):
  111. 0x38616e8 (task3):
  112. 0x38616e8 (task3):
  113. 0x38616e8 (task3):
  114. 0x38616e8 (task3):
  115. 0x38616e8 (task3):
  116. 0x38616e8 (task3):
  117. 0x38616e8 (task3):
  118. 0x38616e8 (task3):
  119. 0x38616e8 (task3):
  120. 0x38616e8 (task3):
  121. 0x38616e8 (task3):
  122. 0x38616e8 (task3):
  123. 0x38616e8 (task3):
  124. 0x38616e8 (task3):
  125. 0x38616e8 (task3):
  126. 0x38616e8 (task3):
  127. 0x38616e8 (task3):
  128. 0x38616e8 (task3):
  129. 0x38616e8 (task3):
  130. 0x38616e8 (task3):
  131. 0x38616e8 (task3):
  132. 0x38616e8 (task3):
  133. 0x38616e8 (task3):
  134. 0x38616e8 (task3):
  135. 0x38616e8 (task3):
  136. 0x38616e8 (task3):
  137. 0x38616e8 (task3):
  138. 0x38616e8 (task3):
  139. 0x38616e8 (task3):
  140. 0x38616e8 (task3):
  141. 0x38616e8 (task3):
  142. 0x38616e8 (task3):
  143. 0x38616e8 (task3):
  144. 0x38616e8 (task3):
  145. 0x38616e8 (task3):
  146. 0x38616e8 (task3):
  147. 0x38616e8 (task3):
  148. 0x38616e8 (task3):
  149. 0x38616e8 (task3):
  150. 0x38616e8 (task3):
  151. 0x38616e8 (task3):
  152. 0x38616e8 (task3):
  153. 0x38616e8 (task3):
  154. 0x38616e8 (task3):
复制代码

而且sched在执行taskspawn的时候,还出现了taskspawn failed错误,既然taskspawn错误了,为何最终3个还是生成了、执行了?
 
 
 

回复

60

帖子

0

TA的资源

一粒金砂(初级)

5
 
顶贴,学习中,愿高手指点迷津。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表