diff options
| author | Dario Nieuwenhuis <[email protected]> | 2020-10-31 22:45:35 +0100 |
|---|---|---|
| committer | Dario Nieuwenhuis <[email protected]> | 2020-10-31 22:45:35 +0100 |
| commit | 2684bf605ac7c7937cb8db7bc9142b3d34c77b17 (patch) | |
| tree | 6064340f376f962c4680296d2a4da720baa9cbf0 /examples | |
| parent | b3858441f76c43981ba13c13aafbd3bdfec3280f (diff) | |
update multiprio example.
Diffstat (limited to 'examples')
| -rw-r--r-- | examples/src/bin/multiprio.rs | 64 |
1 files changed, 20 insertions, 44 deletions
diff --git a/examples/src/bin/multiprio.rs b/examples/src/bin/multiprio.rs index 30a5e85e1..dbca491e0 100644 --- a/examples/src/bin/multiprio.rs +++ b/examples/src/bin/multiprio.rs | |||
| @@ -61,12 +61,13 @@ | |||
| 61 | mod example_common; | 61 | mod example_common; |
| 62 | use example_common::*; | 62 | use example_common::*; |
| 63 | 63 | ||
| 64 | use core::mem::MaybeUninit; | ||
| 65 | use cortex_m_rt::entry; | 64 | use cortex_m_rt::entry; |
| 66 | use embassy::executor::{task, Executor}; | 65 | use nrf52840_hal::clocks; |
| 66 | |||
| 67 | use embassy::executor::{task, TimerExecutor}; | ||
| 67 | use embassy::time::{Duration, Instant, Timer}; | 68 | use embassy::time::{Duration, Instant, Timer}; |
| 69 | use embassy::util::Forever; | ||
| 68 | use embassy_nrf::{interrupt, pac, rtc}; | 70 | use embassy_nrf::{interrupt, pac, rtc}; |
| 69 | use nrf52840_hal::clocks; | ||
| 70 | 71 | ||
| 71 | #[task] | 72 | #[task] |
| 72 | async fn run_high() { | 73 | async fn run_high() { |
| @@ -110,10 +111,10 @@ async fn run_low() { | |||
| 110 | } | 111 | } |
| 111 | } | 112 | } |
| 112 | 113 | ||
| 113 | static mut RTC: MaybeUninit<rtc::RTC<pac::RTC1>> = MaybeUninit::uninit(); | 114 | static RTC: Forever<rtc::RTC<pac::RTC1>> = Forever::new(); |
| 114 | static mut EXECUTOR_LOW: MaybeUninit<Executor<rtc::Alarm<pac::RTC1>>> = MaybeUninit::uninit(); | 115 | static EXECUTOR_LOW: Forever<TimerExecutor<rtc::Alarm<pac::RTC1>>> = Forever::new(); |
| 115 | static mut EXECUTOR_MED: MaybeUninit<Executor<rtc::Alarm<pac::RTC1>>> = MaybeUninit::uninit(); | 116 | static EXECUTOR_MED: Forever<TimerExecutor<rtc::Alarm<pac::RTC1>>> = Forever::new(); |
| 116 | static mut EXECUTOR_HIGH: MaybeUninit<Executor<rtc::Alarm<pac::RTC1>>> = MaybeUninit::uninit(); | 117 | static EXECUTOR_HIGH: Forever<TimerExecutor<rtc::Alarm<pac::RTC1>>> = Forever::new(); |
| 117 | 118 | ||
| 118 | #[entry] | 119 | #[entry] |
| 119 | fn main() -> ! { | 120 | fn main() -> ! { |
| @@ -126,60 +127,35 @@ fn main() -> ! { | |||
| 126 | .set_lfclk_src_external(clocks::LfOscConfiguration::NoExternalNoBypass) | 127 | .set_lfclk_src_external(clocks::LfOscConfiguration::NoExternalNoBypass) |
| 127 | .start_lfclk(); | 128 | .start_lfclk(); |
| 128 | 129 | ||
| 129 | let rtc: &'static _ = unsafe { | 130 | let rtc = RTC.put(rtc::RTC::new(p.RTC1)); |
| 130 | let ptr = RTC.as_mut_ptr(); | ||
| 131 | ptr.write(rtc::RTC::new(p.RTC1)); | ||
| 132 | &*ptr | ||
| 133 | }; | ||
| 134 | |||
| 135 | rtc.start(); | 131 | rtc.start(); |
| 136 | unsafe { embassy::time::set_clock(rtc) }; | 132 | unsafe { embassy::time::set_clock(rtc) }; |
| 137 | 133 | ||
| 138 | let executor_low: &'static _ = unsafe { | 134 | let executor_low = EXECUTOR_LOW.put(TimerExecutor::new(rtc.alarm0(), cortex_m::asm::sev)); |
| 139 | let ptr = EXECUTOR_LOW.as_mut_ptr(); | 135 | let executor_med = EXECUTOR_MED.put(TimerExecutor::new(rtc.alarm1(), cortex_m::asm::sev)); |
| 140 | ptr.write(Executor::new(rtc.alarm0(), cortex_m::asm::sev)); | 136 | let executor_high = EXECUTOR_HIGH.put(TimerExecutor::new(rtc.alarm2(), cortex_m::asm::sev)); |
| 141 | &*ptr | ||
| 142 | }; | ||
| 143 | |||
| 144 | let executor_med: &'static _ = unsafe { | ||
| 145 | let ptr = EXECUTOR_MED.as_mut_ptr(); | ||
| 146 | ptr.write(Executor::new(rtc.alarm1(), || { | ||
| 147 | interrupt::pend(interrupt::SWI0_EGU0) | ||
| 148 | })); | ||
| 149 | &*ptr | ||
| 150 | }; | ||
| 151 | |||
| 152 | let executor_high: &'static _ = unsafe { | ||
| 153 | let ptr = EXECUTOR_HIGH.as_mut_ptr(); | ||
| 154 | ptr.write(Executor::new(rtc.alarm2(), || { | ||
| 155 | interrupt::pend(interrupt::SWI1_EGU1) | ||
| 156 | })); | ||
| 157 | &*ptr | ||
| 158 | }; | ||
| 159 | 137 | ||
| 160 | interrupt::set_priority(interrupt::SWI0_EGU0, interrupt::Priority::Level7); | 138 | interrupt::set_priority(interrupt::SWI0_EGU0, interrupt::Priority::Level7); |
| 161 | interrupt::set_priority(interrupt::SWI1_EGU1, interrupt::Priority::Level6); | 139 | interrupt::set_priority(interrupt::SWI1_EGU1, interrupt::Priority::Level6); |
| 162 | interrupt::enable(interrupt::SWI0_EGU0); | 140 | interrupt::enable(interrupt::SWI0_EGU0); |
| 163 | interrupt::enable(interrupt::SWI1_EGU1); | 141 | interrupt::enable(interrupt::SWI1_EGU1); |
| 164 | 142 | ||
| 165 | unsafe { | 143 | executor_low.spawn(run_low()).dewrap(); |
| 166 | executor_low.spawn(run_low()).dewrap(); | 144 | executor_med.spawn(run_med()).dewrap(); |
| 167 | executor_med.spawn(run_med()).dewrap(); | 145 | executor_high.spawn(run_high()).dewrap(); |
| 168 | executor_high.spawn(run_high()).dewrap(); | ||
| 169 | 146 | ||
| 170 | loop { | 147 | loop { |
| 171 | executor_low.run(); | 148 | executor_low.run(); |
| 172 | cortex_m::asm::wfe(); | 149 | cortex_m::asm::wfe(); |
| 173 | } | ||
| 174 | } | 150 | } |
| 175 | } | 151 | } |
| 176 | 152 | ||
| 177 | #[interrupt] | 153 | #[interrupt] |
| 178 | unsafe fn SWI0_EGU0() { | 154 | unsafe fn SWI0_EGU0() { |
| 179 | EXECUTOR_MED.as_ptr().as_ref().unwrap().run() | 155 | EXECUTOR_MED.steal().run() |
| 180 | } | 156 | } |
| 181 | 157 | ||
| 182 | #[interrupt] | 158 | #[interrupt] |
| 183 | unsafe fn SWI1_EGU1() { | 159 | unsafe fn SWI1_EGU1() { |
| 184 | EXECUTOR_HIGH.as_ptr().as_ref().unwrap().run() | 160 | EXECUTOR_HIGH.steal().run() |
| 185 | } | 161 | } |
