marshallemon 发表于 2010-8-27 13:59:14

请问马老师关于访问“临界代码”时的处理

临界代码一词,我看到它时,是在一本讲单片机操作系统的书上,但如果我的MCU上没有采用操作系统,那是不是就不存在临界代码了?看了本坛有一篇讲全局变量的处理方法后,我晕了,他在中断和主程序中都要对一个全局变量进行读写访问,那在主程序中对该全局变量进行访问前就需要关中断吗,访问后开中断?如果是中断写,主程序读呢,这样主程序中也需要在访问全局变量前关中断,访问后开中断吗?

ba_wang_mao 发表于 2010-8-27 16:12:07

1、临界代码一词,我看到它时,是在一本讲单片机操作系统的书上,但如果我的MCU上没有采用操作系统,那是不是就不存在临界代码了?
    仍然存在。

2、看了本坛有一篇讲全局变量的处理方法后,我晕了,他在中断和主程序中都要对一个全局变量进行读写访问,那在主程序中对该全局变量进行访问前就需要关中断吗,访问后开中断?
   是的。
   记住:需要关闭中断执行的这段代码必须要非常短,不能影响正常中断的执行。

3、如果是中断写,主程序读呢,这样主程序中也需要在访问全局变量前关中断,访问后开中断吗?
   我认为没有必要。

marshallemon 发表于 2010-9-2 09:31:51

请马老师系统的讲解下“类似于这类的问题,什么时候应该开中断,什么时候不需要”

marshallemon 发表于 2010-9-7 08:41:49

自己顶下,别沉了

machao 发表于 2010-9-22 16:36:28

这个问题还是比较复杂的,没有固定的模式。

首先“临界代码”并不仅仅是指一个变量,在中断中和在其它地方都要操作的变量只是一个特例。

重要的原因是:中断的产生是随机的,也就是说可能在任何时间产生。当一段程序正在操作处理一个数据的过程中,如果被中断打断,中断中又改变了这个数据,那么中断返回后,原先正在操作的过程可能就会出问题了。因此这个整个处理的过程都是“临界代码”。


举个简单的例子:

有两个变量X,Y,主程序测试外部接口得到X,并计算得到Y。定时中断中将X和Y的值传出到另外的系统。

当主程序读到一个新的X值,正在计算Y时,还没有计算完成,此时中断到了,那么它发送的是新的X值,而Y值还是老的,这就出现问题了。因此,整个X计算Y的过程,都应该是“临界代码”,理论上,在开始计算前,需要关中断,计算完成后再开放中断,保证X,Y的一致性。

至于是否需要关中断,也看实际情况的需要。比如上例中,5ms的定时中断,只是将X和Y的值传出到显示,而读取X计算Y是1秒一次的话,那么不关中断也可以。在1秒内错误的数据只是显示了5ms,你根本没有看到,而正确数据显示了995ms,这个我们是看到的。

首先要有这样的概念,然后出现问题后,就能很快的分析问题所在,然后解决。

rainyss 发表于 2010-9-23 12:25:05

临界区指的是一段会与其它进程产生冲突的代码,其问题的根本在于"并行执行"上.

楼主应先完全搞清楚"临界"二字的含义,然后才思考后面的问题.临界区是操作系统里相当基础的知识,因此所有教材上对它的分析都比较到位,去找本书认真看一阵子相信就能理解了.当然,临界区不是操作系统特有的,这个要注意,免得说我误导你.

4楼machao的意思的:"临界区是否存在"与"临界区是否需要保护"这两个问题并没有对应关系,要视情况而定.链表/队列上你要是敢不保护临界区,那就真是神牛了.

marshallemon 发表于 2010-9-24 12:42:44

谢谢楼上的两位的回复。

X-Hawk 发表于 2010-9-29 10:54:47

什么死锁,临界,资源回收啊,真是软件工作者的天敌。

csq463276932 发表于 2011-5-25 22:06:39

学习了,谢谢。

biqisohu 发表于 2013-1-5 22:13:21

受教了。谢谢。
页: [1]
查看完整版本: 请问马老师关于访问“临界代码”时的处理