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

时间:2018-06-11 14:29:20

标签: c c11 cortex-m memory-barriers

我正在浏览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时,是否有任何理由无法删除这些说明?

1 个答案:

答案 0 :(得分:0)

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

  1. 单核系统中永远不需要(永远可以省略)内存屏障。
  2. 在同一内存上运行的线程/进程可能在不同内核上运行的多核系统中,始终需要(绝不能省略)内存障碍。
  3. 在硬件级别存在或缺少重新排序的内存写入是无关紧要的。

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

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