aboutsummaryrefslogtreecommitdiff
path: root/embassy-hal-internal
diff options
context:
space:
mode:
authorDario Nieuwenhuis <[email protected]>2024-02-21 21:51:43 +0100
committerDario Nieuwenhuis <[email protected]>2024-02-21 22:13:35 +0100
commit1f17fdf84ee30f989a1a5bd8945a76a9f5edac4b (patch)
treecf3a55b9b72cd836b79ac56b5ce0d36b5a9100d7 /embassy-hal-internal
parentc2e429205d2834f255e065475cefd123448d156a (diff)
nrf/buffered_uart: refactor so rx/tx halves are independent.
Diffstat (limited to 'embassy-hal-internal')
-rw-r--r--embassy-hal-internal/src/atomic_ring_buffer.rs33
1 files changed, 30 insertions, 3 deletions
diff --git a/embassy-hal-internal/src/atomic_ring_buffer.rs b/embassy-hal-internal/src/atomic_ring_buffer.rs
index b4f2cec28..34ceac852 100644
--- a/embassy-hal-internal/src/atomic_ring_buffer.rs
+++ b/embassy-hal-internal/src/atomic_ring_buffer.rs
@@ -1,6 +1,6 @@
1//! Atomic reusable ringbuffer. 1//! Atomic reusable ringbuffer.
2use core::slice;
3use core::sync::atomic::{AtomicPtr, AtomicUsize, Ordering}; 2use core::sync::atomic::{AtomicPtr, AtomicUsize, Ordering};
3use core::{ptr, slice};
4 4
5/// Atomic reusable ringbuffer 5/// Atomic reusable ringbuffer
6/// 6///
@@ -73,6 +73,7 @@ impl RingBuffer {
73 pub unsafe fn deinit(&self) { 73 pub unsafe fn deinit(&self) {
74 // Ordering: it's OK to use `Relaxed` because this is not called 74 // Ordering: it's OK to use `Relaxed` because this is not called
75 // concurrently with other methods. 75 // concurrently with other methods.
76 self.buf.store(ptr::null_mut(), Ordering::Relaxed);
76 self.len.store(0, Ordering::Relaxed); 77 self.len.store(0, Ordering::Relaxed);
77 self.start.store(0, Ordering::Relaxed); 78 self.start.store(0, Ordering::Relaxed);
78 self.end.store(0, Ordering::Relaxed); 79 self.end.store(0, Ordering::Relaxed);
@@ -82,20 +83,46 @@ impl RingBuffer {
82 /// 83 ///
83 /// # Safety 84 /// # Safety
84 /// 85 ///
85 /// Only one reader can exist at a time. 86 /// - Only one reader can exist at a time.
87 /// - Ringbuffer must be initialized.
86 pub unsafe fn reader(&self) -> Reader<'_> { 88 pub unsafe fn reader(&self) -> Reader<'_> {
87 Reader(self) 89 Reader(self)
88 } 90 }
89 91
92 /// Try creating a reader, fails if not initialized.
93 ///
94 /// # Safety
95 ///
96 /// Only one reader can exist at a time.
97 pub unsafe fn try_reader(&self) -> Option<Reader<'_>> {
98 if self.buf.load(Ordering::Relaxed).is_null() {
99 return None;
100 }
101 Some(Reader(self))
102 }
103
90 /// Create a writer. 104 /// Create a writer.
91 /// 105 ///
92 /// # Safety 106 /// # Safety
93 /// 107 ///
94 /// Only one writer can exist at a time. 108 /// - Only one writer can exist at a time.
109 /// - Ringbuffer must be initialized.
95 pub unsafe fn writer(&self) -> Writer<'_> { 110 pub unsafe fn writer(&self) -> Writer<'_> {
96 Writer(self) 111 Writer(self)
97 } 112 }
98 113
114 /// Try creating a writer, fails if not initialized.
115 ///
116 /// # Safety
117 ///
118 /// Only one writer can exist at a time.
119 pub unsafe fn try_writer(&self) -> Option<Writer<'_>> {
120 if self.buf.load(Ordering::Relaxed).is_null() {
121 return None;
122 }
123 Some(Writer(self))
124 }
125
99 /// Return length of buffer. 126 /// Return length of buffer.
100 pub fn len(&self) -> usize { 127 pub fn len(&self) -> usize {
101 self.len.load(Ordering::Relaxed) 128 self.len.load(Ordering::Relaxed)