Ken*_*Lin 8 embedded arm cortex-m3 cortex-m
在ARM 文档中,它提到
Cortex-M4 处理器支持 ARMv7 未对齐访问,并将所有访问作为单个未对齐访问执行。它们通过 DCode 和系统总线接口转换为两个或多个对齐的访问。
我不清楚这是否意味着数据访问对程序员来说是原子的。然后我发现了一个 StackOverflow注释,将文档解释为:
实际上,一些 ARM 处理器(例如 Cortex-M3)支持硬件中的未对齐访问,因此即使是未对齐的读/写也是原子的。访问可能跨越多个总线周期到内存,但没有机会让另一条指令在其间跳转,因此对程序员来说是原子的。
不过,我看了看周围多一些,发现索赔违背了先前的要求:
另一个事实是,在 ARMv6 及更高版本的内核上,为了让硬件“修复”未对齐的访问,它会将其拆分为多个较小的字节负载。但是,这些不是原子的!。
那么,我相信谁呢?对于某些情况,我的项目中的打包结构中的每个元素都有 setter/getter 。换句话说,某些结构元素可能未对齐。我想知道在 Cortex-M4 上访问结构元素是否总是保证是原子的。如果不是,我想我将不得不手动启用/禁用中断或添加一些互斥锁,但如果 ARM Cortex M4 可以保证数据访问是原子的,我宁愿不这样做。
不,不是。
请参阅ARMv7-M 架构参考手册的 A3.5.3 节:
在 ARMv7-M 中,单副本原子处理器访问是:
- 所有字节访问。
- 所有半字访问半字对齐的位置。
- 所有字访问字对齐位置
因此,如果您复制的 uint32 未与 32 位边界对齐(v7-M 中允许),则该复制不是原子的。
还引用:
当访问不是单副本原子时,它将作为一系列较小的访问来执行,每个访问都是单副本原子的,至少在字节级别是这样。