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

Concurrency 当两个变量之间可能发生中断时,安全地访问它们,concurrency,microcontroller,interrupt,Concurrency,Microcontroller,Interrupt,首先,我欢迎对这个问题的标题进行编辑,我想不出如何更好地表达它,但我对自己的想法不太满意 这是一个关于并发性的问题,我的应用程序在C语言的微控制器上,但我认为这没什么大不了的 我有一个中断程序,可以改变两个全局变量的值。我有一些可以读取这些变量的主代码。但它必须从两个集合中获取一致的值,这意味着我不能先读取一个,然后再读取另一个,因为中断可能发生在这两个集合之间,并同时更改它们,使我只能从一个集合中读取一个,从另一个集合中读取一个 通常我只会对读取两个变量的代码的一小部分禁用中断,但我不能这样做

首先,我欢迎对这个问题的标题进行编辑,我想不出如何更好地表达它,但我对自己的想法不太满意

这是一个关于并发性的问题,我的应用程序在C语言的微控制器上,但我认为这没什么大不了的

我有一个中断程序,可以改变两个全局变量的值。我有一些可以读取这些变量的主代码。但它必须从两个集合中获取一致的值,这意味着我不能先读取一个,然后再读取另一个,因为中断可能发生在这两个集合之间,并同时更改它们,使我只能从一个集合中读取一个,从另一个集合中读取一个

通常我只会对读取两个变量的代码的一小部分禁用中断,但我不能这样做,因为中断需要在正确的时间被调用,调用中没有“抖动”。读取和存储变量的4或5条指令将导致中断定时出现过多抖动。(我在中断中生成PAL视频,因此任何定时抖动都会导致屏幕上像素的可见移动)

我可以重新安排代码,以不同的方式执行此操作,这样相同的中断就不会对这两件事负责,从长远来看,我可能会这样做,但这样做是一项重要的工作。不管怎样,这个问题现在已经成为我感兴趣的一个“谜题”,即使我后来重新编码以避免这种情况

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

不管我是在中断发生之前还是之后得到值,只要两个值都来自同一个地方


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

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

编辑:


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

这是一个Cortex-M3(LPC1343)。啊,是的,我明白你的意思,把这两个词组合成一个词,然后在一个指令中写出来。。。。那就行了,它们都是单字节计数。现在你说的很简单,为什么我没有想到:)尽管我必须加上警告:假设所说的数据大小是可以原子访问的。一个字节通常是原子的。但是16位(或32位)访问可能不是原子的——考虑数据总线只有8位(或16位)的系统。对于CORTEX-M3,它将是原子操作,但是最便携的方式是用第二种方式来完成。这也有道理。这是基本的东西,很明显我今天早上没有醒,有点不好意思我没有想到。第二个建议叫做双缓冲,它是解决这类问题的标准方案。