当它们之间可能发生中断时,可以安全地访问两个变量

时间:2010-07-21 08:04:28

标签: concurrency microcontroller interrupt

首先,我欢迎编辑这个问题的标题,我想不出如何更好地说出来,但我对我想出的内容不太满意。

这是关于并发性的问题,我的应用程序是在C语言的微控制器上,但我认为这不重要。

我有一个可以改变两个全局变量值的中断例程。我有一些可以读取这些变量的主代码。但它必须从两者中获得一致的值,这意味着我无法读取一个然后读取另一个,因为中断可能发生在两者之间并且两者都改变​​它们,让我从一组读一个而从另一组读一个。 / p>

通常我只会为读取这两个变量的代码的微小部分禁用中断,但是我不能这样做,因为需要在恰当的时间调用中断而不会在调用中产生“抖动”。读取和存储变量的4或5条指令将导致中断时序抖动过大。 (我在中断中生成PAL视频,因此任何时间抖动都会导致屏幕上像素的可见移动)。

我可以重新安排代码以不同的方式执行此操作,以便相同的中断不对这两件事负责,而且长期我可能会这样做,但这是很重要的工作。无论如何,这个问题现在变得很有趣,即使我后来为了避免这种情况而重新编码也是一个“谜题”。

所以我要问的是,有什么方法可以读取这两个变量并确保它们处于一致状态而不会禁用中断吗?

只要两个值来自同一个地方,只要我在中断发生之前或之后得到值就没关系。

我考虑过单独的“版本号”计数来确保每个变量与读取的版本相同,但这只会使问题变得更糟,因为现在我有4个变量需要读取。

1 个答案:

答案 0 :(得分:3)

您使用的是哪种微控制器?我们在谈论什么样的变数?如果您需要少于4个字节并使用32位MCU,则可以通过将两个变量放入一个32位变量来解决此问题。

编辑:

如果您使用的是8位MCU,我认为您可以做的最好方法是将变量放入结构,创建此结构的数组(2个元素)并使用一个变量来指示当前用于读取的结构。然后你的中断改变了未使用的结构,之后改变了指标的值。