可以在ARM Cortex M4中安全地省略DMB指令

我正在浏览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 ... 

由于ARM Cortex M4屏障指令的编程指南声明:

在图41和图42的示例中省略DMB或DSB指令不会导致任何错误,因为Cortex-M处理器:

  • 不要重新排序内存传输
  • 不允许两个写传输重叠。

在针对Cortex M时,是否有任何理由无法删除这些指令?

我不知道Cortex M4是否可用于多CPU /多核配置,但一般情况下:

  1. 在单核系统中永远不需要(总是可以省略)内存屏障。
  2. 在多核系统中总是需要内存屏障(永远不能省略),其中在同一内存上运行的线程/进程可能在不同的内核上运行。

在硬件级别存在或不存在重新排序的存储器写入是无关紧要的。

当然我希望DMB指令在不支持SMP的芯片上基本上是免费的,所以我不确定你为什么要试图破解它。

请注意,根据问题引用编译器为primefaces内在函数生成的代码,我假设上下文用于primefaces的同步以使它们与高级规范匹配,而不是其他用途,如MMIO的IO障碍,以及以上“从不”不应理解为适用于此(无关)用途(尽管我怀疑,由于您已经引用的原因,它不适用于Cortex M4)。