diff options
| author | pennae <[email protected]> | 2023-04-25 18:44:02 +0200 |
|---|---|---|
| committer | pennae <[email protected]> | 2023-05-01 12:53:32 +0200 |
| commit | f2469776f4f229dff23eb7f0bf59c00290620d9c (patch) | |
| tree | 693355a04b888601fa2732b003c92ecee25da85c | |
| parent | a10850a6dacc0672f998069457bf104eb970c746 (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.rs | 36 |
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 | |||
| 133 | impl<'d, PIO: PioInstance, SM: PioStateMachine + Unpin> Drop for FifoOutFuture<'d, PIO, SM> { | 131 | impl<'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, | |||
| 193 | impl<'d, PIO: PioInstance, SM: PioStateMachine> Drop for FifoInFuture<'d, PIO, SM> { | 187 | impl<'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> { | |||
| 264 | impl<'d, PIO: PioInstance> Drop for IrqFuture<PIO> { | 254 | impl<'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 | } |
