aboutsummaryrefslogtreecommitdiff
path: root/examples
diff options
context:
space:
mode:
authorDario Nieuwenhuis <[email protected]>2020-10-31 22:45:35 +0100
committerDario Nieuwenhuis <[email protected]>2020-10-31 22:45:35 +0100
commit2684bf605ac7c7937cb8db7bc9142b3d34c77b17 (patch)
tree6064340f376f962c4680296d2a4da720baa9cbf0 /examples
parentb3858441f76c43981ba13c13aafbd3bdfec3280f (diff)
update multiprio example.
Diffstat (limited to 'examples')
-rw-r--r--examples/src/bin/multiprio.rs64
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 @@
61mod example_common; 61mod example_common;
62use example_common::*; 62use example_common::*;
63 63
64use core::mem::MaybeUninit;
65use cortex_m_rt::entry; 64use cortex_m_rt::entry;
66use embassy::executor::{task, Executor}; 65use nrf52840_hal::clocks;
66
67use embassy::executor::{task, TimerExecutor};
67use embassy::time::{Duration, Instant, Timer}; 68use embassy::time::{Duration, Instant, Timer};
69use embassy::util::Forever;
68use embassy_nrf::{interrupt, pac, rtc}; 70use embassy_nrf::{interrupt, pac, rtc};
69use nrf52840_hal::clocks;
70 71
71#[task] 72#[task]
72async fn run_high() { 73async fn run_high() {
@@ -110,10 +111,10 @@ async fn run_low() {
110 } 111 }
111} 112}
112 113
113static mut RTC: MaybeUninit<rtc::RTC<pac::RTC1>> = MaybeUninit::uninit(); 114static RTC: Forever<rtc::RTC<pac::RTC1>> = Forever::new();
114static mut EXECUTOR_LOW: MaybeUninit<Executor<rtc::Alarm<pac::RTC1>>> = MaybeUninit::uninit(); 115static EXECUTOR_LOW: Forever<TimerExecutor<rtc::Alarm<pac::RTC1>>> = Forever::new();
115static mut EXECUTOR_MED: MaybeUninit<Executor<rtc::Alarm<pac::RTC1>>> = MaybeUninit::uninit(); 116static EXECUTOR_MED: Forever<TimerExecutor<rtc::Alarm<pac::RTC1>>> = Forever::new();
116static mut EXECUTOR_HIGH: MaybeUninit<Executor<rtc::Alarm<pac::RTC1>>> = MaybeUninit::uninit(); 117static EXECUTOR_HIGH: Forever<TimerExecutor<rtc::Alarm<pac::RTC1>>> = Forever::new();
117 118
118#[entry] 119#[entry]
119fn main() -> ! { 120fn 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]
178unsafe fn SWI0_EGU0() { 154unsafe 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]
183unsafe fn SWI1_EGU1() { 159unsafe fn SWI1_EGU1() {
184 EXECUTOR_HIGH.as_ptr().as_ref().unwrap().run() 160 EXECUTOR_HIGH.steal().run()
185} 161}