在ARM documentation中,它提到了
Cortex-M4处理器支持ARMv7不对齐访问,并且 将所有访问作为单个未对齐的访问执行。他们是 通过DCode和System转换为两个或更多对齐的访问 总线接口。
我不清楚这是否意味着对程序员来说数据访问是原子的。然后我发现一个StackOverflow comment将文档解释为:
实际上,某些ARM处理器(例如Cortex-M3)不对齐 硬件访问,因此即使未对齐的读/写也是原子的。访问 可能跨越多个总线周期到内存,但是没有机会 在另一条指令之间跳转,因此对于 程序员。
但是,我环顾了一下,发现claims与先前的主张相反:
另一个事实是,在开始于ARMv6及更高版本的内核上, 为了使硬件“修复”未对齐的访问,它会将其拆分 分成多个较小的字节加载。但是,这些不是原子的!。
那么,我相信谁?在某些情况下,我在项目的压缩结构中为每个元素设置了/设置了多个元素。换句话说,某些结构元素可能未对齐。我想知道是否可以始终保证在Cortex-M4上访问struct元素是原子的。如果不是,我想我将不得不手动启用/禁用中断或添加一些互斥锁,但是我宁愿ARM Cortex M4只能保证数据访问是原子的。
答案 0 :(得分:1)
不是,不是。
请参阅https://static.docs.arm.com/ddi0403/eb/DDI0403E_B_armv7m_arm.pdf的A3.5.3节
引用自ARMv7-M参考手册
mappedBy
因此,如果您要复制未对齐32位边界(在v7-M中允许)的uint32,则该副本不是原子的。
也引用
In ARMv7-M, the single-copy atomic processor accesses are:
• All byte accesses.
• All halfword accesses to halfword-aligned locations.
• All word accesses to word-aligned locations
答案 1 :(得分:-2)
具有单个Cortex-M4 / M3的cpus上的未对齐访问是原子的,因为CPU是管线式的,但不是超标量的。对于具有5条管线的Cortex-M7而言,绝对不是这样。但是,我不会依赖它,因为它会使您的代码不可移植,如果您这样做,则应该在它上面写一个大提示。 供应商可以在其中创建具有更多cortex-m4内核的cpu,我认为这就是为什么ARM表示未对齐访问永远不是原子的。 (它们产生更独特的内存访问)
整个事情可能比这复杂得多,您可以在本文档中找到一些提示。 Arm guide to Cortex-m memory barriers
请参阅与Cortex-m3 / m4实现相关的章节