mirror of
https://github.com/embassy-rs/embassy.git
synced 2025-10-01 14:20:33 +00:00
fix: load/store ordering
This commit is contained in:
parent
bfd82ff82c
commit
50224583db
@ -178,15 +178,15 @@ impl AnyChannel {
|
|||||||
if sr.tcf() {
|
if sr.tcf() {
|
||||||
ch.fcr().write(|w| w.set_tcf(true));
|
ch.fcr().write(|w| w.set_tcf(true));
|
||||||
|
|
||||||
let lli_count = state.lli_state.count.load(Ordering::Relaxed);
|
let lli_count = state.lli_state.count.load(Ordering::Acquire);
|
||||||
let complete = if lli_count > 0 {
|
let complete = if lli_count > 0 {
|
||||||
let next_lli_index = state.lli_state.index.load(Ordering::Relaxed) + 1;
|
let next_lli_index = state.lli_state.index.load(Ordering::Acquire) + 1;
|
||||||
let complete = next_lli_index >= lli_count;
|
let complete = next_lli_index >= lli_count;
|
||||||
|
|
||||||
state
|
state
|
||||||
.lli_state
|
.lli_state
|
||||||
.index
|
.index
|
||||||
.store(if complete { 0 } else { next_lli_index }, Ordering::Relaxed);
|
.store(if complete { 0 } else { next_lli_index }, Ordering::Release);
|
||||||
|
|
||||||
complete
|
complete
|
||||||
} else {
|
} else {
|
||||||
|
@ -20,11 +20,11 @@ impl<'a> DmaCtrl for DmaCtrlImpl<'a> {
|
|||||||
let state = &STATE[self.0.id as usize];
|
let state = &STATE[self.0.id as usize];
|
||||||
let current_remaining = self.0.get_remaining_transfers() as usize;
|
let current_remaining = self.0.get_remaining_transfers() as usize;
|
||||||
|
|
||||||
let lli_count = state.lli_state.count.load(Ordering::Relaxed);
|
let lli_count = state.lli_state.count.load(Ordering::Acquire);
|
||||||
|
|
||||||
if lli_count > 0 {
|
if lli_count > 0 {
|
||||||
let lli_index = state.lli_state.index.load(Ordering::Relaxed);
|
let lli_index = state.lli_state.index.load(Ordering::Acquire);
|
||||||
let single_transfer_count = state.lli_state.transfer_count.load(Ordering::Relaxed) / lli_count;
|
let single_transfer_count = state.lli_state.transfer_count.load(Ordering::Acquire) / lli_count;
|
||||||
|
|
||||||
(lli_count - lli_index - 1) * single_transfer_count + current_remaining
|
(lli_count - lli_index - 1) * single_transfer_count + current_remaining
|
||||||
} else {
|
} else {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user