我正在浏览GCC为ARM Cortex M4生成的程序集,并注意到atomic_compare_exchange_weak
在条件周围插入了两条DMB
指令(使用-std=gnu11 -O2
使用GCC 4.9编译) :
// if (atomic_compare_exchange_weak(&address, &x, y))
dmb sy
ldrex r0, [r3]
cmp r0, r2
itt eq
strexeq lr, r1, [r3]
cmpeq.w lr, #0
dmb sy
bne.n ...
由于programming guide to barrier instructions for ARM Cortex M4表示:
在图41和图42的示例中省略DMB或DSB指令不会导致任何错误,因为Cortex-M处理器:
- 不重新订购内存传输
- 不允许两次写入传输重叠。
在针对Cortex M时,是否有任何理由无法删除这些说明?
答案 0 :(得分:0)
我不知道Cortex M4是否可用于多CPU /多核配置,但一般情况下:
在硬件级别存在或缺少重新排序的内存写入是无关紧要的。
当然我希望DMB指令在不支持SMP的芯片上基本上是免费的,所以我不确定你为什么要试图破解它。
请注意,基于问题引用编译器为原子内在函数生成的代码,我假设上下文用于原子的同步以使它们与高级规范匹配,而不是其他用途,如MMIO的IO障碍,以上“从不”不应理解为适用于此(无关)用途(尽管我怀疑,由于您已经引用的原因,它不适用于Cortex M4)。