OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3315|回复: 3

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

[复制链接]

2

主题

2

帖子

0

精华

新手入门

积分
38
金钱
38
注册时间
2015-1-21
在线时间
5 小时
发表于 2016-10-21 19:55:17 | 显示全部楼层 |阅读模式
1金钱
精英版 例6-3 UCOSIII时间片轮转调度  例程中OSTaskCreate 时候Task1 2 轮渡时间2个tick   也就是10ms
void task1_task(void *p_arg)   核心代码 for(i=0;i<5;i++) {printf("Task1:%d\r\n",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\r\n",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次串口输出,时间应该是很快的.不应该这么巧碰上调度阿.....这个想不通.....

求明白人解答,或是对次了解的人谈谈看法.....

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2016-10-22 19:55:32 | 显示全部楼层
回复

使用道具 举报

4

主题

22

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
258
金钱
258
注册时间
2015-7-30
在线时间
60 小时
发表于 2016-12-13 21:32:25 | 显示全部楼层
遇到了同样的问题,帮顶
欢迎一起讨论,学习
回复

使用道具 举报

3

主题

401

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1766
金钱
1766
注册时间
2015-6-11
在线时间
312 小时
发表于 2016-12-13 22:06:09 | 显示全部楼层
明显是访问共享资源printf(串口)没有加锁,去看下线程同步,了解下临界区或者任务锁,就可以解决
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-29 07:36

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表