搜索
bottom↓
回复: 11

UCOSIII中无干扰下最高优先级任务何时才会任务切换?

[复制链接]

出0入0汤圆

发表于 2016-7-29 22:59:42 | 显示全部楼层 |阅读模式
一直都想不懂一个问题,就我的个人理解,假定一个优先级只有一个任务,在UCOSIII中OSPrioTbl[]和OSRdyList[]不受外界干扰的话,里面的值是不会变的把,从任务调度的角度来说,那么CPU岂不是一直会反复执行最高优先级的任务?不知道自己哪里理解出错了,系统不受任何干扰下,因为每个任务都有一个死循环,不知道高优先级任务执行到哪个位置才会切换到低优先级任务?OSPrioTbl[]和OSRdyList[]的值会自行变化的吗?

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2016-7-29 23:04:45 | 显示全部楼层
DEMO RUN 一下,比谁都体会更深。。。

出0入0汤圆

发表于 2016-7-30 00:01:16 | 显示全部楼层
你肯定不能一直抢占呀,有时候主动OSdelay(1)一下呀,哪怕一个tick也行!不然你就在一个task内处理全部功能也行!就跟一个main函数while一样,那还要os搞铲铲呀!

出0入8汤圆

发表于 2016-7-30 08:47:25 | 显示全部楼层
本帖最后由 security 于 2016-7-30 08:54 编辑

没用过 uc/os 系列,不过我试着,从操作系统的理论给你说几点:
1、uc/os-iii 使用的调度算法是:优先级 + 时间片轮转
2、优先级指的是,高优先级一旦就绪,就可以抢占低优先级的执行权,换句话说,高优先级如果一直处于 ready 状态,就会一直 run, 那么低优先级的任务,就只能永远在墙角哭了(一直 block)
3、因此高优先级的任务,不能总是 ready/run,总是要适时主动进入 block 状态,进入的方法:task_delay、等待内核同步对象等(信号量、互斥量、消息队列、事件等),task_suspend 等
4、而时间片轮转,只针对同一优先级的任务,这个理论上不需要你主动进入 block 状态(当然你如果这样,就会影响到更低优先级的任务,原因参考上面所述),因为时间片一到,就会被强制切换到下一个就绪任务(同一优先级)

出0入0汤圆

 楼主| 发表于 2016-7-30 09:26:54 | 显示全部楼层
security 发表于 2016-7-30 08:47
没用过 uc/os 系列,不过我试着,从操作系统的理论给你说几点:
1、uc/os-iii 使用的调度算法是:优先级 +  ...

非常感谢前辈!

出0入0汤圆

 楼主| 发表于 2016-7-30 09:28:48 | 显示全部楼层
ArthurBruin 发表于 2016-7-30 00:01
你肯定不能一直抢占呀,有时候主动OSdelay(1)一下呀,哪怕一个tick也行!不然你就在一个task内处理全部功 ...

好的,谢谢!

出0入0汤圆

 楼主| 发表于 2016-7-30 09:30:13 | 显示全部楼层
ArthurBruin 发表于 2016-7-30 00:01
你肯定不能一直抢占呀,有时候主动OSdelay(1)一下呀,哪怕一个tick也行!不然你就在一个task内处理全部功 ...

我以为CPU会把就绪任务按优先级都执行一遍,我测试的时候好像也是这样,我得仔细看看。

出0入10汤圆

发表于 2016-7-30 09:31:36 | 显示全部楼层
在高优先级的任务中,必须要比如pend、delay这些函数来放掉CPU,让低优先级的任务执行,不然的话,就跟前后台模式一样了,就剩下高优先级任务一个自己玩了。如果对源码和ucos机制感兴趣可以去看下我签名档的书籍

出0入8汤圆

发表于 2016-7-30 09:35:52 | 显示全部楼层
qianshan 发表于 2016-7-30 09:30
我以为CPU会把就绪任务按优先级都执行一遍,我测试的时候好像也是这样,我得仔细看看。 ...

你的理解是错误的。
你可以写一个高优先级的任务,和低优先级的任务 的点灯程序测试下,伪代码如下:
  1. while (1)
  2. {
  3.         // TODO: Turn on LED
  4.        
  5.         // 延时
  6.        
  7.         // TODO: Turn off LED
  8.        
  9.         // 延时
  10. }
复制代码

看看,延时操作,用 软件死等的方式  和 操作系统的 task_delay 函数试验下

出0入0汤圆

 楼主| 发表于 2016-7-30 09:35:58 | 显示全部楼层
10xjzheng 发表于 2016-7-30 09:31
在高优先级的任务中,必须要比如pend、delay这些函数来放掉CPU,让低优先级的任务执行,不然的话,就跟前后 ...

好的,谢谢!

出0入0汤圆

 楼主| 发表于 2016-7-30 09:37:21 | 显示全部楼层
security 发表于 2016-7-30 09:35
你的理解是错误的。
你可以写一个高优先级的任务,和低优先级的任务 的点灯程序测试下,伪代码如下:
看 ...

嗯嗯,谢谢。

出0入0汤圆

发表于 2016-7-30 21:32:40 | 显示全部楼层
1个Tick结束之后,或者其他当前执行任务进入Delay
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-25 08:02

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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