UcosIII时间片BUG求解答...原子哥看过来

2019-10-16 01:46发布

精英版 例6-3 UCOSIII时间片轮转调度  例程中OSTaskCreate 时候Task1 2 轮渡时间2个tick   也就是10ms
void task1_task(void *p_arg)   核心代码 for(i=0;i<5;i++) {printf("Task1:%d ",OSTickCtr);}   OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_HMSM_STRICT,&err); //延时1s
void task2_task(void *p_arg)     核心代码 for(i=0;i<5;i++) {printf("Task2:%d ",OSTickCtr);}   OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_HMSM_STRICT,&err); //延时1s

串口输出 出现异常 结果Task1:26
Task1:26
Task1:26
Task1:26
Task1:26
Task2:27
Task2:27
Task2:27
Task2:27
Task2:27
Task1:227
Task1:227
Task1:227
Task2:228
Task2:228
Task2:228
Task1:229
Task1:229
Task2:229
Task2:229
Task1:429
Task1:429
Task1:429
Task1:430
Task1:430
Task2:430
Task2:431
Task2:431
Task2:431
Task2:431
Task1:630
Task1:630
Task1:630
Task2:631
Task2:631
Task2:631
Task1:632
Task1:632
Task2:632
Task2:632
Task1:832
Task1:832
Task1:832
Task1:833
Task1:833
Task2:833
Task2:834
Task2:834
Task2:834
Task2:834
Task1:1033
Task1:1033
Task1:10Task2:1034
Task2:1034
Task2:1033
Task1:1035
Task1:1035
34
Task2:1035
Task2:1035
Task1:1235
Task1:1235
Task1:12Task2:1236
Task2:1236
Task2:1235
Task1:1237
Task1:1237
36
Task2:1237
Task2:1237




修改 轮换时间片为4个Tick  也就是20ms以上时  串口输出异常消除  如下
(或是加临界段也能解决)


LCD ID:9341
Task1:24
Task1:24
Task1:24
Task1:24
Task1:24
Task2:27
Task2:27
Task2:27
Task2:27
Task2:27
Task1:225
Task1:225
Task1:225
Task1:225
Task1:226
Task2:228
Task2:228
Task2:228
Task2:229
Task2:229
Task1:426
Task1:426
Task1:426
Task1:427
Task1:427

即T1再Printf过程中 被调度到T2,T2也再执行过程中被调度到T1,分析可能为10ms不够完成整个Task1而被调度, 但还是不太明白...总感觉怪怪的,在后续修改时间片长度过程中发现调度问题。

分析:要执行同任务级别调度,必再OSTIMETICK中调用 OS_SchedRoundRobin(&OSRdyList[OSPrioCur]); 从而切换同任务级别的 任务控制块顶即HeadPtr;  但不进行调度
而OSIntExit();      只执行 OSTCBHighRdyPtr = OSRdyList[OSPrioHighRdy].HeadPtr;   也就是执行HeadPtr;  

疑惑:1.当Task1执行完调用 OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_HMSM_STRICT,&err);  进入等待状态,但这时候OSTIMETICK并没有到来也就不会切换HeadPtr;
     那么同任务等级的Task2就不会立即执行,而要等到TICK到来....如果Task1,2作为系统的就绪任务中的最高等级,这不就违背了初衷吗.....这是不是时间片算法的一个问题???    不知道是自己对进入等待状态时执行的东西了解不够全面还是确实存在这个问题...求解答..

2.另外当时间片为2个Tick串口输出异常也太奇怪了,5次串口输出,时间应该是很快的.不应该这么巧碰上调度阿.....这个想不通.....

求明白人解答,或是对次了解的人谈谈看法.....
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
正点原子
1楼-- · 2019-10-16 07:23
帮顶
孤独爱95
2楼-- · 2019-10-16 07:25
 精彩回答 2  元偷偷看……
zc123
3楼-- · 2019-10-16 12:38
明显是访问共享资源printf(串口)没有加锁,去看下线程同步,了解下临界区或者任务锁,就可以解决

一周热门 更多>