aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpennae <[email protected]>2023-04-25 18:44:02 +0200
committerpennae <[email protected]>2023-05-01 12:53:32 +0200
commitf2469776f4f229dff23eb7f0bf59c00290620d9c (patch)
tree693355a04b888601fa2732b003c92ecee25da85c
parenta10850a6dacc0672f998069457bf104eb970c746 (diff)
rp/pio: use atomic accesses, not critical sections
atomic accesses are not only faster but also can't conflict with other critical sections.
-rw-r--r--embassy-rp/src/pio.rs36
1 files changed, 12 insertions, 24 deletions
diff --git a/embassy-rp/src/pio.rs b/embassy-rp/src/pio.rs
index e3b6ca97c..f0d550d95 100644
--- a/embassy-rp/src/pio.rs
+++ b/embassy-rp/src/pio.rs
@@ -117,10 +117,8 @@ impl<'d, PIO: PioInstance, SM: PioStateMachine + Unpin> Future for FifoOutFuture
117 unsafe { 117 unsafe {
118 let irq = PIO::Irq::steal(); 118 let irq = PIO::Irq::steal();
119 irq.disable(); 119 irq.disable();
120 critical_section::with(|_| { 120 PIOS[PIO::PIO_NO as usize].irqs(0).inte().write_set(|m| {
121 PIOS[PIO::PIO_NO as usize].irqs(0).inte().modify(|m| { 121 m.0 = TXNFULL_MASK << SM::Sm::SM_NO;
122 m.0 |= TXNFULL_MASK << SM::Sm::SM_NO;
123 });
124 }); 122 });
125 irq.enable(); 123 irq.enable();
126 } 124 }
@@ -133,10 +131,8 @@ impl<'d, PIO: PioInstance, SM: PioStateMachine + Unpin> Future for FifoOutFuture
133impl<'d, PIO: PioInstance, SM: PioStateMachine + Unpin> Drop for FifoOutFuture<'d, PIO, SM> { 131impl<'d, PIO: PioInstance, SM: PioStateMachine + Unpin> Drop for FifoOutFuture<'d, PIO, SM> {
134 fn drop(&mut self) { 132 fn drop(&mut self) {
135 unsafe { 133 unsafe {
136 critical_section::with(|_| { 134 PIOS[PIO::PIO_NO as usize].irqs(0).inte().write_clear(|m| {
137 PIOS[PIO::PIO_NO as usize].irqs(0).inte().modify(|m| { 135 m.0 = TXNFULL_MASK << SM::Sm::SM_NO;
138 m.0 &= !(TXNFULL_MASK << SM::Sm::SM_NO);
139 });
140 }); 136 });
141 } 137 }
142 } 138 }
@@ -177,10 +173,8 @@ impl<'d, PIO: PioInstance, SM: PioStateMachine> Future for FifoInFuture<'d, PIO,
177 unsafe { 173 unsafe {
178 let irq = PIO::Irq::steal(); 174 let irq = PIO::Irq::steal();
179 irq.disable(); 175 irq.disable();
180 critical_section::with(|_| { 176 PIOS[PIO::PIO_NO as usize].irqs(0).inte().write_set(|m| {
181 PIOS[PIO::PIO_NO as usize].irqs(0).inte().modify(|m| { 177 m.0 = RXNEMPTY_MASK << SM::Sm::SM_NO;
182 m.0 |= RXNEMPTY_MASK << SM::Sm::SM_NO;
183 });
184 }); 178 });
185 irq.enable(); 179 irq.enable();
186 } 180 }
@@ -193,10 +187,8 @@ impl<'d, PIO: PioInstance, SM: PioStateMachine> Future for FifoInFuture<'d, PIO,
193impl<'d, PIO: PioInstance, SM: PioStateMachine> Drop for FifoInFuture<'d, PIO, SM> { 187impl<'d, PIO: PioInstance, SM: PioStateMachine> Drop for FifoInFuture<'d, PIO, SM> {
194 fn drop(&mut self) { 188 fn drop(&mut self) {
195 unsafe { 189 unsafe {
196 critical_section::with(|_| { 190 PIOS[PIO::PIO_NO as usize].irqs(0).inte().write_clear(|m| {
197 PIOS[PIO::PIO_NO as usize].irqs(0).inte().modify(|m| { 191 m.0 = RXNEMPTY_MASK << SM::Sm::SM_NO;
198 m.0 &= !(RXNEMPTY_MASK << SM::Sm::SM_NO);
199 });
200 }); 192 });
201 } 193 }
202 } 194 }
@@ -250,10 +242,8 @@ impl<'d, PIO: PioInstance> Future for IrqFuture<PIO> {
250 unsafe { 242 unsafe {
251 let irq = PIO::Irq::steal(); 243 let irq = PIO::Irq::steal();
252 irq.disable(); 244 irq.disable();
253 critical_section::with(|_| { 245 PIOS[PIO::PIO_NO as usize].irqs(0).inte().write_set(|m| {
254 PIOS[PIO::PIO_NO as usize].irqs(0).inte().modify(|m| { 246 m.0 = SMIRQ_MASK << self.irq_no;
255 m.0 |= SMIRQ_MASK << self.irq_no;
256 });
257 }); 247 });
258 irq.enable(); 248 irq.enable();
259 } 249 }
@@ -264,10 +254,8 @@ impl<'d, PIO: PioInstance> Future for IrqFuture<PIO> {
264impl<'d, PIO: PioInstance> Drop for IrqFuture<PIO> { 254impl<'d, PIO: PioInstance> Drop for IrqFuture<PIO> {
265 fn drop(&mut self) { 255 fn drop(&mut self) {
266 unsafe { 256 unsafe {
267 critical_section::with(|_| { 257 PIOS[PIO::PIO_NO as usize].irqs(0).inte().write_clear(|m| {
268 PIOS[PIO::PIO_NO as usize].irqs(0).inte().modify(|m| { 258 m.0 = SMIRQ_MASK << self.irq_no;
269 m.0 &= !(SMIRQ_MASK << self.irq_no);
270 });
271 }); 259 });
272 } 260 }
273 } 261 }