打印

求助:uCOSII 关中断开中断作为互斥条件的问题

[复制链接]
2992|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
afterqcd|  楼主 | 2008-9-21 11:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
acmilann| | 2008-9-22 01:59 | 只看该作者

任务的调度是因为内核调用了任务切换函数

使用特权

评论回复
板凳
armecos| | 2008-9-22 07:33 | 只看该作者

关了总中断就不会调度了

使用特权

评论回复
地板
afterqcd|  楼主 | 2008-9-22 12:00 | 只看该作者

谢谢了

使用特权

评论回复
5
古代C人| | 2008-9-22 18:17 | 只看该作者

如果关了中断,还能调度,那就神了。

使用特权

评论回复
6
John_Lee| | 2008-9-23 21:19 | 只看该作者

抢占的概念

看来楼主对“抢占”的概念还有些模糊。

首先说明一下,引起调度(任务切换)的原因有两个:
1、任务主动进入了阻塞状态,就像2楼说的,调用了所谓的切换函数。
2、中断,中断服务程序(isr)改变了任务状态,使某个比当前任务优先级高的任务进入了准备好(ready)状态,于是内核调用了切换函数。

这两个原因可以称为“同步方式调度”和“异步方式调度”。抢占的意义在于:如果高优先级任务进入准备好状态后,操作系统可以立即调度(任务切换),将高优先级任务投入运行。而这些动作对低优先级任务来说是完全透明的。

但是,谁?!使高优先级任务进入准备好状态,而又对低优先级任务透明呢?就是“中断”。

所以说,“抢占”是系统进行了“异步方式调度”的结果。既然关闭了中断,也就禁止了抢占。楼主,你想明白了吗?

在这里也要纠正一下3楼和5楼:“关了中断,就禁止了调度”这种说法不妥。关了中断,只是禁止了抢占,但并没有禁止调度啊。如果不相信,可以自己做一下实验。

使用特权

评论回复
7
hotpower| | 2008-9-23 21:25 | 只看该作者

俺总喜欢听John_Lee老师的课~~~

使用特权

评论回复
8
Swd21ic| | 2008-9-23 22:02 | 只看该作者

re

谁说关了中断就不能调度了?
主动请求调度还是可以的 OSSempend

使用特权

评论回复
9
kanprin| | 2008-9-23 23:50 | 只看该作者

我也喜欢听john_lee老师的课……

使用特权

评论回复
10
armecos| | 2008-9-24 12:10 | 只看该作者

关中断后调度会导致死锁。

使用特权

评论回复
11
John_Lee| | 2008-9-24 13:21 | 只看该作者

看来10楼是真有问题哦

不用中断来进行调度的操作系统,就是没有抢占,说白了就是一个协作式操作系统,怎么会一定导致死锁?难道抢占式操作系统就不会出现死锁?

其实,死锁是多个任务在企图获取多个独占(exclusive)资源时,可能导致的一种所有参与任务全部被阻塞的状态。这分明是属于应用程序的逻辑概念,而调度则是属于操作系统的逻辑概念,怎么能混为一谈。

我相信armecos应该懂得这些概念,在3楼和10楼的发言都只是笔误而已,但这可能会误导别人的啊(特别是初学者),希望发言最好能严谨一些。

使用特权

评论回复
12
armecos| | 2008-9-24 13:44 | 只看该作者

ucos不是协作式的,

有三种情况引起调度:
1、定时中断,即tick;
2、外部中断事件,在ISR/DSR里释放信号量;
3、调用阻塞函数主动放权

开关中断成对儿使用,在关中断情况下或在ISR里不要使用阻塞函数,有危险!!!

使用特权

评论回复
13
afterqcd|  楼主 | 2008-9-24 14:01 | 只看该作者

谢谢John_Lee,谢谢各位哈

不过我还是不太明白,我好好看下然后再上来和大家讨论

使用特权

评论回复
14
afterqcd|  楼主 | 2008-9-24 15:24 | 只看该作者

好像想明白了

正在运行的任务是所有就绪任务中优先级最高的,如果要运行其它优先级更高的任务,就只有发生了某些事件使得更高优先级的任务进入了就绪状态,而这些事件只有在两种情况下发生:
1. 中断改变了任务状态
2. 运行中的任务主动使优先级更高的任务进入就绪状态

2 相当于是主动放弃CPU占有权,所以说抢占是由中断引起的,是异步调度的结果

所以就是你说的结论,关中断只是关了抢占,而运行中的任务依然可以主动做任务调度。这里uC/OS有一个非常重要的前提条件,就是 运行中的任务是所有就绪任务中优先级最高的,如果没有事件发生就会一直运行直到完成。

John_Lee,我理解的对不?

使用特权

评论回复
15
John_Lee| | 2008-9-24 19:38 | 只看该作者

基本上是理解了

所以,你最开始的疑问:“关中断只是屏蔽了中断,并没有阻止任务切换,高优先级的任务任然可以抢占CPU并访问临界区和共享变量啊”

关了中断,就禁止了抢占,如果当前任务也没有进行主动调度,当然系统中也就不会出现比当前优先级更高的任务进入就绪了,也就谈不上去“抢占CPU并访问临界区和共享变量”了。

“为什么关中断开中断可以作为互斥条件,而且是最粗暴的方式呢?”

按上面的解释,开关中断是可以作为互斥条件的,但的确很粗暴。众所周知,嵌入式实时操作系统最关键的性能指标之一便是中断响应时间。中断响应时间越短,实时性就越好。但很多嵌入式操作系统(包括uCos在内)的中断响应时间都比较长。原因就是在这些操作系统中大量使用了关中断这种“粗暴”的方式(OS_ENTER_CRITICAL),你可以看看uCos, FreeRTOS等操作系统的源码,这样的写法比比皆是。当然,不用OS_ENTER_CRITICAL是不可能的,那会造成数据混乱,这是它们的系统结构所决定的。

如果能保证在中断处理中不去写共享数据(包括可能改变共享数据的系统调用),就可以不用关中断了,但这需要改变系统结构,把中断服务分为两个部分,这就是所谓的“Top half 和 Bottom half”。如果想了解具体,你可以去网上查查。应用这种技术的操作系统有Linux, Windows, eCos等。

使用特权

评论回复
16
afterqcd|  楼主 | 2008-9-25 14:08 | 只看该作者

又受教了

谢谢

使用特权

评论回复
17
jack.king| | 2008-9-26 15:57 | 只看该作者

ls那里有移植(51)好了的ucos没?

ls那里有移植(51)好了的ucos没?
   我找了好多都是不可以用的!也搞不清楚到底那里出了问题头好痛啊?
   

使用特权

评论回复
18
afterqcd|  楼主 | 2008-9-27 18:23 | 只看该作者

没有啊

我只是在看书,还在看理论

使用特权

评论回复
19
yifeng1118| | 2012-7-28 15:35 | 只看该作者
11# John_Lee
做技术的都应该象John学习严谨和负责的态度!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

10

帖子

0

粉丝