【发布时间】:2018-06-11 14:29:19
【问题描述】:
我正在查看由 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 时无法删除这些指令有什么原因吗?
【问题讨论】:
-
您是否使用适当的
-march选项准确定位该处理器? -
@JensGustedt 是的,一切都已设置并正常工作,该项目已有 1 年历史,我们只是改变了一些零件的工作方式,所以这是我第一次检查装配部分。
标签: c c11 cortex-m memory-barriers