aboutsummaryrefslogtreecommitdiff
path: root/examples/src/bin/rtc_async.rs
diff options
context:
space:
mode:
Diffstat (limited to 'examples/src/bin/rtc_async.rs')
-rw-r--r--examples/src/bin/rtc_async.rs61
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
9use core::mem::MaybeUninit; 9use core::mem::MaybeUninit;
10use cortex_m_rt::entry; 10use cortex_m_rt::entry;
11use embassy::clock::Monotonic; 11use embassy::executor::{task, Executor, WfeModel};
12use embassy::time::{Duration, Instant, Timer};
13use embassy_nrf::pac;
12use embassy_nrf::rtc; 14use embassy_nrf::rtc;
13use futures_intrusive::timer::{Clock, LocalTimer, LocalTimerService};
14use nrf52840_hal::clocks; 15use nrf52840_hal::clocks;
15use static_executor::{task, Executor};
16
17struct RtcClock<T>(rtc::RTC<T>);
18
19impl<T: rtc::Instance> Clock for RtcClock<T> {
20 fn now(&self) -> u64 {
21 self.0.now()
22 }
23}
24 16
25#[task] 17#[task]
26async fn run1(rtc: &'static rtc::RTC<embassy_nrf::pac::RTC1>, timer: &'static LocalTimerService) { 18async 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]
34async fn run2(rtc: &'static rtc::RTC<embassy_nrf::pac::RTC1>, timer: &'static LocalTimerService) { 26async 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
41static EXECUTOR: Executor = Executor::new(cortex_m::asm::sev); 33static mut RTC: MaybeUninit<rtc::RTC<pac::RTC1>> = MaybeUninit::uninit();
42static mut RTC: MaybeUninit<RtcClock<embassy_nrf::pac::RTC1>> = MaybeUninit::uninit(); 34static mut EXECUTOR: MaybeUninit<Executor<WfeModel, rtc::Alarm<pac::RTC1>>> = MaybeUninit::uninit();
43static mut TIMER: MaybeUninit<LocalTimerService> = MaybeUninit::uninit();
44 35
45#[entry] 36#[entry]
46fn main() -> ! { 37fn 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}