diff options
Diffstat (limited to 'examples/src/bin/rtc_async.rs')
| -rw-r--r-- | examples/src/bin/rtc_async.rs | 61 |
1 files changed, 20 insertions, 41 deletions
diff --git a/examples/src/bin/rtc_async.rs b/examples/src/bin/rtc_async.rs index 977621d4c..3bffabf0f 100644 --- a/examples/src/bin/rtc_async.rs +++ b/examples/src/bin/rtc_async.rs | |||
| @@ -8,39 +8,30 @@ use example_common::*; | |||
| 8 | 8 | ||
| 9 | use core::mem::MaybeUninit; | 9 | use core::mem::MaybeUninit; |
| 10 | use cortex_m_rt::entry; | 10 | use cortex_m_rt::entry; |
| 11 | use embassy::clock::Monotonic; | 11 | use embassy::executor::{task, Executor, WfeModel}; |
| 12 | use embassy::time::{Duration, Instant, Timer}; | ||
| 13 | use embassy_nrf::pac; | ||
| 12 | use embassy_nrf::rtc; | 14 | use embassy_nrf::rtc; |
| 13 | use futures_intrusive::timer::{Clock, LocalTimer, LocalTimerService}; | ||
| 14 | use nrf52840_hal::clocks; | 15 | use nrf52840_hal::clocks; |
| 15 | use static_executor::{task, Executor}; | ||
| 16 | |||
| 17 | struct RtcClock<T>(rtc::RTC<T>); | ||
| 18 | |||
| 19 | impl<T: rtc::Instance> Clock for RtcClock<T> { | ||
| 20 | fn now(&self) -> u64 { | ||
| 21 | self.0.now() | ||
| 22 | } | ||
| 23 | } | ||
| 24 | 16 | ||
| 25 | #[task] | 17 | #[task] |
| 26 | async fn run1(rtc: &'static rtc::RTC<embassy_nrf::pac::RTC1>, timer: &'static LocalTimerService) { | 18 | async fn run1() { |
| 27 | loop { | 19 | loop { |
| 28 | info!("tick 1"); | 20 | info!("BIG INFREQUENT TICK"); |
| 29 | timer.deadline(rtc.now() + 64000).await; | 21 | Timer::after(Duration::from_ticks(64000)).await; |
| 30 | } | 22 | } |
| 31 | } | 23 | } |
| 32 | 24 | ||
| 33 | #[task] | 25 | #[task] |
| 34 | async fn run2(rtc: &'static rtc::RTC<embassy_nrf::pac::RTC1>, timer: &'static LocalTimerService) { | 26 | async fn run2() { |
| 35 | loop { | 27 | loop { |
| 36 | info!("tick 2"); | 28 | info!("tick"); |
| 37 | timer.deadline(rtc.now() + 23000).await; | 29 | Timer::after(Duration::from_ticks(13000)).await; |
| 38 | } | 30 | } |
| 39 | } | 31 | } |
| 40 | 32 | ||
| 41 | static EXECUTOR: Executor = Executor::new(cortex_m::asm::sev); | 33 | static mut RTC: MaybeUninit<rtc::RTC<pac::RTC1>> = MaybeUninit::uninit(); |
| 42 | static mut RTC: MaybeUninit<RtcClock<embassy_nrf::pac::RTC1>> = MaybeUninit::uninit(); | 34 | static mut EXECUTOR: MaybeUninit<Executor<WfeModel, rtc::Alarm<pac::RTC1>>> = MaybeUninit::uninit(); |
| 43 | static mut TIMER: MaybeUninit<LocalTimerService> = MaybeUninit::uninit(); | ||
| 44 | 35 | ||
| 45 | #[entry] | 36 | #[entry] |
| 46 | fn main() -> ! { | 37 | fn main() -> ! { |
| @@ -55,35 +46,23 @@ fn main() -> ! { | |||
| 55 | 46 | ||
| 56 | let rtc: &'static _ = unsafe { | 47 | let rtc: &'static _ = unsafe { |
| 57 | let ptr = RTC.as_mut_ptr(); | 48 | let ptr = RTC.as_mut_ptr(); |
| 58 | ptr.write(RtcClock(rtc::RTC::new(p.RTC1))); | 49 | ptr.write(rtc::RTC::new(p.RTC1)); |
| 59 | &*ptr | 50 | &*ptr |
| 60 | }; | 51 | }; |
| 61 | 52 | ||
| 62 | rtc.0.start(); | 53 | rtc.start(); |
| 54 | unsafe { embassy::time::set_clock(|| RTC.as_ptr().as_ref().unwrap().now()) }; | ||
| 63 | 55 | ||
| 64 | let timer: &'static _ = unsafe { | 56 | let executor: &'static _ = unsafe { |
| 65 | let ptr = TIMER.as_mut_ptr(); | 57 | let ptr = EXECUTOR.as_mut_ptr(); |
| 66 | ptr.write(LocalTimerService::new(rtc)); | 58 | ptr.write(Executor::new(rtc.alarm0())); |
| 67 | &*ptr | 59 | &*ptr |
| 68 | }; | 60 | }; |
| 69 | 61 | ||
| 70 | unsafe { | 62 | unsafe { |
| 71 | EXECUTOR.spawn(run1(&rtc.0, timer)).dewrap(); | 63 | executor.spawn(run1()).dewrap(); |
| 72 | EXECUTOR.spawn(run2(&rtc.0, timer)).dewrap(); | 64 | executor.spawn(run2()).dewrap(); |
| 73 | |||
| 74 | loop { | ||
| 75 | timer.check_expirations(); | ||
| 76 | |||
| 77 | EXECUTOR.run(); | ||
| 78 | |||
| 79 | match timer.next_expiration() { | ||
| 80 | // If this is in the past, set_alarm will immediately trigger the alarm, | ||
| 81 | // which will make the wfe immediately return so we do another loop iteration. | ||
| 82 | Some(at) => rtc.0.set_alarm(at, cortex_m::asm::sev), | ||
| 83 | None => rtc.0.clear_alarm(), | ||
| 84 | } | ||
| 85 | 65 | ||
| 86 | cortex_m::asm::wfe(); | 66 | executor.run() |
| 87 | } | ||
| 88 | } | 67 | } |
| 89 | } | 68 | } |
