Skip to content

Commit ebc3110

Browse files
committed
elaborate on when a memory barrier is needed
1 parent 6835ec6 commit ebc3110

File tree

1 file changed

+21
-3
lines changed

1 file changed

+21
-3
lines changed

src/dma.md

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -199,9 +199,27 @@ the fences will prevent the operations on `x` from being merged even though we
199199
know that `buf` doesn't overlap with `x` (due to Rust aliasing rules). However,
200200
there exist no intrinsic that's more fine grained than `compiler_fence`.
201201

202-
> **NOTE:** You *may* need to use a [`atomic::fence`][] (a memory barrier)
203-
> instead of a `compiler_fence` if you expect your API to be used with buffers
204-
> shared between different cores. But this depends on how you design your API.
202+
### Don't we need a memory barrier?
203+
204+
That depends on the target architecture. In the case of Cortex-M cores, [AN321]
205+
says:
206+
207+
[AN321]: https://static.docs.arm.com/dai0321/a/DAI0321A_programming_guide_memory_barriers_for_m_profile.pdf
208+
209+
> The use of DMB is rarely needed in Cortex-M processors because they do not
210+
> reorder memory transactions. However, it is needed if the software is to be
211+
> reused on other ARM processors, especially multi-master systems. For example:
212+
>
213+
> - DMA controller configuration. A barrier is required between a CPU memory
214+
> access and a DMA operation.
215+
>
216+
> (..)
217+
218+
If your target is a multi-core system then it's very likely that you'll need
219+
memory barriers.
220+
221+
If you do need the memory barrier then you need to use [`atomic::fence`] instead
222+
of `compiler_fence`.
205223

206224
[`atomic::fence`]: https://doc.rust-lang.org/core/sync/atomic/fn.fence.html
207225

0 commit comments

Comments
 (0)