所以,你最开始的疑问:“关中断只是屏蔽了中断,并没有阻止任务切换,高优先级的任务任然可以抢占CPU并访问临界区和共享变量啊”
关了中断,就禁止了抢占,如果当前任务也没有进行主动调度,当然系统中也就不会出现比当前优先级更高的任务进入就绪了,也就谈不上去“抢占CPU并访问临界区和共享变量”了。
“为什么关中断开中断可以作为互斥条件,而且是最粗暴的方式呢?”
按上面的解释,开关中断是可以作为互斥条件的,但的确很粗暴。众所周知,嵌入式实时操作系统最关键的性能指标之一便是中断响应时间。中断响应时间越短,实时性就越好。但很多嵌入式操作系统(包括uCos在内)的中断响应时间都比较长。原因就是在这些操作系统中大量使用了关中断这种“粗暴”的方式(OS_ENTER_CRITICAL),你可以看看uCos, FreeRTOS等操作系统的源码,这样的写法比比皆是。当然,不用OS_ENTER_CRITICAL是不可能的,那会造成数据混乱,这是它们的系统结构所决定的。
如果能保证在中断处理中不去写共享数据(包括可能改变共享数据的系统调用),就可以不用关中断了,但这需要改变系统结构,把中断服务分为两个部分,这就是所谓的“Top half 和 Bottom half”。如果想了解具体,你可以去网上查查。应用这种技术的操作系统有Linux, Windows, eCos等。
|