簡體   English   中英

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

[英]Can DMB instructions be safely omitted in ARM Cortex M4

我正在查看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的芯片上基本上是免費的,因此我不確定為什么要嘗試破解它。

請注意,基於問題的引用,編譯器為原子內在函數生成了代碼,我假設上下文是原子的同步,以使其與高級規范相匹配,而不是其他用途,例如MMIO的IO屏障,以及上面的“從不”不應該被理解為適用於這種(無關的)用途(盡管我懷疑,由於您已經提到的原因,它不適用於Cortex M4)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM