uint16_t和uint32_t中断在Cortex M架构中安全吗?

时间:2019-06-12 18:33:02

标签: interrupt cortex-m

我正在研究一些嵌入式的东西。我有多个中断可能正在处理相同的数据,因此我想知道uint16_tuint32_t数据类型是否是中断安全的。

如果中断正在处理uint16/32_t数据,并且被另一个试图读取该数据的中断中途中断,它将看到损坏的数据。这可能吗?

谢谢

2 个答案:

答案 0 :(得分:2)

要从@DinhQC扩展answer,只要数据正确,关于16位和32位数据类型的所有单结果指令对于Cortex-M上的中断都是“原子的”对齐的(并且必须非常努力地使C编译器为您提供未对齐的数据,因为未对齐的访问很慢并且需要特殊处理)。在大多数实现中,可以中断并恢复诸如LDMSTM之类的多结果操作,但是LDMSTM中每个单独的32位传输的完整性是保证。

重要的是要了解您正在执行的操作是否在机器级别上是单一指令。例如,如果要增加一个共享变量,这将需要三个指令:读取,修改和写入。如果在读写之间发生中断,并且中断服务程序修改了相同的变量,则当ISR返回时,此修改将被覆盖。

一种安全的方法是使用某种硬件支持的机制对共享数据强制执行原子性或互斥。与禁用和重新启用中断相比,Cortex-M上有更强大,更灵活,更快速的互斥方法,但是特别是STREXLDREX指令(在C中也可用) 。看看my answer to this other question了解更多信息。

答案 1 :(得分:0)

Cortex-M处理器不会损坏,并为您的数据提供未定义的值。该值将始终是确定性的。但是,在发生中断的情况下,有许多条件会影响数据的值。 uint16/32_t数据可以位于内存中,也可以仅位于处理器寄存器中。如果在内存中,则可以是16/32位对齐的,也可以不是16/32位对齐的。处理器,例如M0或M4,以及对数据执行的操作,例如加或乘,也很重要。所有这些都将确定用于处理数据的指令是否是原子的。

您可以在discussionthis(由Joseph Yiu回答)中找到更多详细信息。

通常来说,如果指令是原子的(单个执行周期),则中断不会干扰数据操作。但是,在您的C代码级别,uint16/32_t数据操作可能需要1条以上的指令。因此,很难保证程序能够按预期运行。这也适用于uint8_t数据。您可能希望在处理共享数据之前先禁用中断,然后再启用中断。该技术answer很好地介绍了(请看第2点)。