OpenEdv-开源电子网

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

关于uCOSII任务调度的疑惑

[复制链接]

3

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2015-8-18
在线时间
2 小时
发表于 2015-9-14 17:14:37 | 显示全部楼层 |阅读模式
5金钱

程序中有三个任务task1,task2,task3,分别让三个二极管闪烁,其优先级为分别5,6,7,调试了半天,有些疑惑:
1)当系统开始运行时,会先执行task1,再调用到task2,当执行完task2后会产生一次切换,此时由于task1的优先级高于task3,那这样就会继续执行task1,这样      task3没有机会执行,但事实不是这样的,三个二极管都闪烁了,这是什么情况;
2)我考虑到,可能跟程序中的延时有关,我调节延时时间,当task1中延时时间小于5ms时,task2和task3均不执行;
3)当我调节task2的延时时间小于5ms时,task1执行,此时task3不执行;
   创建任务的代码和任务接口函数如下:



从上面的调试过程可以看出低优先级的任务应该是利用高优先级的任务的延时间隙完成任务的,当延时间隙太小时,就会一直执行最高优先级的任务,参考了网上一些资料,好像说是跟UCOSII的时钟节拍有关,但想知道系统到底是怎么解决的,还有那个延时时间分界点5ms到底跟什么有关,求大神指导,希望原子哥能够帮忙解决疑惑,感激不尽

最佳答案

查看完整内容[请看2#楼]

回复【2楼】Rsmygd: --------------------------------- 第一个问题:三个LED都会闪烁(前提是现在每一个任务的延时都是大于5ms)。首先task1起来,延时1000ms,注意ucos的延时不是cpu在这里死等,而是task1交出控制权(和裸跑的区别)。那么这1000ms对于task1来说就是空闲时间,这时候task2起来,同理也会有1000ms的空闲,那之后的task3起来是在task1和task2空闲时间之内的,而不是task1、task2、task3同时就位,所以三个灯都会闪 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

16

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2015-4-24
在线时间
0 小时
发表于 2015-9-14 17:14:38 | 显示全部楼层
回复【2楼】Rsmygd:
---------------------------------
第一个问题:三个LED都会闪烁(前提是现在每一个任务的延时都是大于5ms)。首先task1起来,延时1000ms,注意ucos的延时不是cpu在这里死等,而是task1交出控制权(和裸跑的区别)。那么这1000ms对于task1来说就是空闲时间,这时候task2起来,同理也会有1000ms的空闲,那之后的task3起来是在task1和task2空闲时间之内的,而不是task1、task2、task3同时就位,所以三个灯都会闪烁。
第二个问题:你把task1的延时时间减少到5ms以下,就意味着task1永远不会交出控制权,一直占用着cpu,即使task1的优先级最低,这样操作,也只会运行task1,其它进程都不会运行,因为拿不到cpu的控制权。
第三个问题:5ms对于ucos来说就是一个时钟节拍,就理解成时钟的最小单位即可(区别于裸跑,最小时钟单位的长度肯定要大的多,因为要处理系统调度)。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165225
金钱
165225
注册时间
2010-12-1
在线时间
2107 小时
发表于 2015-9-14 17:14:38 | 显示全部楼层
回复【3楼】逍遥子:
---------------------------------
第二个问题不对。

systick中断,如果你的任务优先级是最低,则可以引起调度的。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

3

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2015-8-18
在线时间
2 小时
 楼主| 发表于 2015-9-14 17:17:10 | 显示全部楼层
不小心点错了,该贴还没有解决,希望大神帮忙解释一下,谢谢
回复

使用道具 举报

3

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2015-8-18
在线时间
2 小时
 楼主| 发表于 2015-9-14 21:17:04 | 显示全部楼层
回复【3楼】逍遥子:
---------------------------------
恩,谢谢了。我刚搜了写资料,有些个人理解,不知道对不对,望纠正。
1)时钟节拍时可以改变的,由OS_TASK_IDLE_STK_SIZE参数配置得来,其是uCOSII的最小时钟单位;
2)每一个任务都有一个任务控制表OS_TCB,其主要用来保存任务的当前状态,在控制表有一个时间延时项OSTCBDly,调用函数OSTimeDly()可以给OSTCBDly赋延时值。uC/OS—II中有函数OSTimTick(),叫时钟节拍函数,它的一项工作就是给每个用户任务控制块OS_TCB中的时间延迟项OSTCBDly减1(如果该项不为零),当某项任务的任务控制块中的时间延时项OSTCBDly减为0时,这个任务就进入了就绪态,等待任务切换;
3)对于多个任务调度时,对于每个任务都有一个时间延时项(OSTCBDly),同时也有一个程序中的延时(1000ms),对于这两个延时的关系,感觉还没搞清楚。同时由于有这两类延时的存在,感觉多任务的时序图挺麻烦的,如果有好的理解,求指点,谢谢
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165225
金钱
165225
注册时间
2010-12-1
在线时间
2107 小时
发表于 2015-9-14 23:19:51 | 显示全部楼层
回复【4楼】Rsmygd:
---------------------------------
1,是的。
2,是的。
3,这个倒是不太清楚了,程序延时是程序员控制的,时间延时,你这是UCOSIII么?II不支持的。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

3

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2015-8-18
在线时间
2 小时
 楼主| 发表于 2015-9-15 10:14:44 | 显示全部楼层
回复【6楼】正点原子:
---------------------------------
谢谢原子哥回复,我的困惑:
1)你说的时间延时是指OSTimeDly()吗?这不就是UCOSII中的吗?uCOSII中包括时间管理的几个函数:OSTimeDly(),OSTimeDlyResume();任务控制表OS_TCB中OSTCBDly用来保存OSTimeDly()中断之前的状态;时钟节拍函数OSTimTick()用来递减OSTCBDly的值,当其为0时,延时也就结束,此时任务进入就绪表中,这应该就是时间管理的过程吧?
2)对于我上面提出的问题3,我有新的理解:不应该存在这两种时间延时,其实应该理解为两种不同的时间延时的表达方式,其最终目的都是为了让高优先级的任务延时,从而可以进行任务切换,使低优先级的任务也可以执行,即其中的delay_ms(n)应该是可以写成OSTimeDly(m)的,不知道这样理解对不对。如果是这样的,想问原子哥那种延时方式好像一些;
3)新的困惑:高优先级的任务要延时,让任务可以切换,使低优先级工作,那这个延时时间的时长是怎么确定的呢?其怎样取值才比较合理了?
望原子哥解惑,感激不尽
回复

使用道具 举报

170

主题

917

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1824
金钱
1824
注册时间
2013-4-13
在线时间
63 小时
发表于 2015-9-16 00:58:59 | 显示全部楼层
1,既然是任务每个任务都应该有运行的机会,否则写这个线程干什么?
2,原子的deIay与ucOs中的延时本质是一样的,都是那个24位的时钟节拍,uC0slI的“时间片"是5ms,内核每5ms都会扫描一次就绪表,只要就绪登记了的都有机会,当系统启动调度时,优先级高的Task1首先获得cPU,如果5ms以内就执行完了Task1则2,3任务就没有机会在就绪表登记,自然就一直处于睡眠态而无法运行。如何唤醒它们呢?UC0s可以通过消息邮箱,信号量等机制实现任务间的通信,使各个任务协调运行!任务的延时时期实际上就是任务由运行态进入等候态!等待期间那个滴滴答答节拍以时间片递减,递减时期CPU就找新的就绪去了。  
3,关于ucOs最好的学习方法是用BC4.5工具在DOS环境下模拟运行,效果很好,再结合一下多读源码理解,效果则更佳!uCOs的函数不多,c基础好一点的话容易读懂,和JaVA的类库比,这点量的函数不算多了。
4,个人看法,欢迎交流
手艺人要内外兼修。
回复

使用道具 举报

170

主题

917

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1824
金钱
1824
注册时间
2013-4-13
在线时间
63 小时
发表于 2015-9-16 01:03:55 | 显示全部楼层
个人感觉emWin的函数比uCOs多,但是学习uCOs比emWin更长知识!
手艺人要内外兼修。
回复

使用道具 举报

170

主题

917

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1824
金钱
1824
注册时间
2013-4-13
在线时间
63 小时
发表于 2015-9-16 02:11:49 | 显示全部楼层
很抱歉,关于2有误,更改:
当主函数中每个任务创建完毕时,其就绪表相应的位会置1,表示已就绪。启动任务后,优先级高的获得cPU先行权。
手艺人要内外兼修。
回复

使用道具 举报

3

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2015-8-18
在线时间
2 小时
 楼主| 发表于 2015-9-16 17:35:17 | 显示全部楼层
回复【10楼】wangyan915205:
---------------------------------
非常感谢你的回复,我发现越理解深就疑惑越多,还希望你能热心解惑:
1)那个时钟节拍,就是UCOSII的“时间片”,这个应该不是固定的吧,它可以用这个参数OS_TASK_IDLE_STK_SIZE改变;
2)对于延时函数我还是有疑惑,就是说任务中的延时目的是为让其他任务有获取资源执行的机会,那这个延时时间有具体要求吗?一般多大为好,它与任务的执行时间有关吗?或许需要以后慢慢调试多任务程序,从经验中而得;
3)你推荐的BC4.5工具和多读源码,我会慢慢学习的,你有比较好的资源吗?如果有,希望能分享一下,感激不尽。
很是感激,感觉从原子哥这个论坛受益匪浅。
回复

使用道具 举报

170

主题

917

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1824
金钱
1824
注册时间
2013-4-13
在线时间
63 小时
发表于 2015-9-17 01:15:36 | 显示全部楼层
1)是的 
2),延时多久根据实际需要测试,延时的目的很多,但一旦延时任务就进入等候态,
3),BC包网上可下载,
4),既然是系统肯定是有难度,人家顶级
专业团队开发的东西如果让我们轻易就学会了,那…
一起学吧,原孑是用心在做事业!
手艺人要内外兼修。
回复

使用道具 举报

3

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2015-8-18
在线时间
2 小时
 楼主| 发表于 2015-9-17 12:40:48 | 显示全部楼层
回复【12楼】wangyan915205:
---------------------------------
恩,谢了
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-1 16:33

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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