搜索
bottom↓
回复: 13

请教UCOS III 一个任务切换问题。。。

[复制链接]

出0入0汤圆

发表于 2014-6-8 23:23:25 | 显示全部楼层 |阅读模式
如果,我在一个低优先级的任务加入一个for(;;);的话(不用系统的延时函数),系统还能正常进行任务切换吗?
经过实验,系统会卡死在循环for里。
但是根据书上写的,systick不是会进行中断吗?每次退出中断不是会切换到优先级最高的就绪任务吗?
好像卡在for里,systick 的 isr 也进不了啦
是不是必须用延时函数呢?

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

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2014-6-14 22:43:44 | 显示全部楼层
systick中断并不会直接进行任务切换,只是会遍历任务链表,看个任务的延时是否到等,从而将延时结束的任务放到任务就绪表,最后任务就绪表中如果有更高优先级任务才进行任务切换。低优先级的任务被执行,说明高优先级的任务被阻塞,需要等待信号量,或者做了系统延时,当其他的低优先级任务或中断发送了信号量后,会立即切换到高优先级任务,低优先级任务被抢占。如果这个低优先级任务中没有做系统延时或等信号量等释放CPU的操作,那么比它更低的任务永远不会得到执行,像空闲任务,统计任务等。但是比他高的任务有可能被执行,这取决于你任务的具体内容。

出0入0汤圆

 楼主| 发表于 2014-6-15 11:19:32 | 显示全部楼层
lingdianhao 发表于 2014-6-14 22:43
systick中断并不会直接进行任务切换,只是会遍历任务链表,看个任务的延时是否到等,从而将延时结束的任务 ...

但问题是,连优先级比他高的任务都不能运行了。应该systick每次退出中断前会切换到当前优先级最高的就绪任务啊,不是吗?

出0入0汤圆

发表于 2014-6-15 11:29:35 | 显示全部楼层
没问题的,是你移植或者配置有问题,可以用这个里面的例子改下:
http://www.amobbs.com/thread-5579469-1-1.html

出0入0汤圆

 楼主| 发表于 2014-6-15 11:39:23 | 显示全部楼层
Eric2013 发表于 2014-6-15 11:29
没问题的,是你移植或者配置有问题,可以用这个里面的例子改下:
http://www.amobbs.com/thread-5579469-1- ...

其实我也怀疑是移植问题,我是用ucosIII移植到STM32F107的官方例程,我用的是F103,但要是每个任务都用延时函数,系统又一切正常啊???
我用OS_TimeGet来获得当前的tick,tick也一直增加,是不是说明systick中断及其isr正常呢?

出0入0汤圆

发表于 2014-6-15 11:41:02 | 显示全部楼层
mruio 发表于 2014-6-15 11:39
其实我也怀疑是移植问题,我是用ucosIII移植到STM32F107的官方例程,我用的是F103,但要是每个任务都用延 ...

可以这么认为。

出0入0汤圆

发表于 2014-6-16 23:05:01 | 显示全部楼层
可以仿真具体看一下。

出0入0汤圆

 楼主| 发表于 2014-6-17 00:11:01 | 显示全部楼层
本帖最后由 mruio 于 2014-6-17 00:13 编辑
lingdianhao 发表于 2014-6-16 23:05
可以仿真具体看一下。


仿真时发现,进入systick中断后,执行OSInExit时,每次都把当前任务(即执行for(;;)的任务)判断为最高优先级,实际上这个任务为最低优先级,有更高优先级的任务就绪
在获取最高优先级就绪任务是有一个用汇编写的CPU_CntLeadZeros,与这个有没有关呢,stm32f103 有没有CLZ这个指令???
系统在没有上述那样的死循环的情况下是可以运行多任务的,不过按照现在的情况,那就不叫可剥夺型实时多任务内核了吧。。。

出0入0汤圆

发表于 2014-6-20 16:47:41 | 显示全部楼层
我也遇到这个问题了,请问你是怎么解决的?

出0入0汤圆

 楼主| 发表于 2014-6-20 23:40:28 | 显示全部楼层
guoweiming 发表于 2014-6-20 16:47
我也遇到这个问题了,请问你是怎么解决的?

其实把OSTickTask的优先级提高就可以了

出0入0汤圆

发表于 2014-6-21 16:03:56 | 显示全部楼层
mruio 发表于 2014-6-20 23:40
其实把OSTickTask的优先级提高就可以了

i see 楼主机智!

出0入0汤圆

发表于 2014-6-29 23:54:56 | 显示全部楼层
没有加入它的延时是不会切换到别的任务的。

出0入0汤圆

 楼主| 发表于 2014-6-30 09:45:27 | 显示全部楼层
貌似ucos ii 就不需要osticktask,iii才要

出0入0汤圆

发表于 2014-6-30 11:35:24 | 显示全部楼层
本帖最后由 M.dd 于 2014-6-30 13:37 编辑
ucosIII有两种中断处理方式,由OS_CFG_ISR_POST_DEFERED_EN控制,置0时也不需要osticktask

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

本版积分规则

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

GMT+8, 2024-5-20 01:54

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

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