From 127ce6a217bc611dd382ef8ca02e03c4667bda0e Mon Sep 17 00:00:00 2001 From: Per Lindgren <per.lindgren@ltu.se> Date: Sun, 2 Feb 2020 11:35:34 +0100 Subject: [PATCH] rtfm_schedule.rs --- examples/rtfm_schedule.rs | 49 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 examples/rtfm_schedule.rs diff --git a/examples/rtfm_schedule.rs b/examples/rtfm_schedule.rs new file mode 100644 index 0000000..587b9c0 --- /dev/null +++ b/examples/rtfm_schedule.rs @@ -0,0 +1,49 @@ +#![deny(unsafe_code)] +#![deny(warnings)] +#![no_main] +#![no_std] + +use cortex_m::peripheral::DWT; +use cortex_m_semihosting::hprintln; +use panic_halt as _; +use rtfm::cyccnt::{Instant, U32Ext as _}; + +#[rtfm::app(device = stm32f4xx_hal::stm32, monotonic = rtfm::cyccnt::CYCCNT)] +const APP: () = { + #[init(schedule = [foo, bar])] + fn init(cx: init::Context) { + let mut core = cx.core; + + // Initialize (enable) the monotonic timer (CYCCNT) + core.DCB.enable_trace(); + // required on Cortex-M7 devices that software lock the DWT (e.g. STM32F7) + DWT::unlock(); + core.DWT.enable_cycle_counter(); + + // semantically, the monotonic timer is frozen at time "zero" during `init` + // NOTE do *not* call `Instant::now` in this context; it will return a nonsense value + let now = cx.start; // the start time of the system + + hprintln!("init @ {:?}", now).unwrap(); + + // Schedule `foo` to run 8e6 cycles (clock cycles) in the future + cx.schedule.foo(now + 8_000_000.cycles()).unwrap(); + + // Schedule `bar` to run 4e6 cycles in the future + cx.schedule.bar(now + 4_000_000.cycles()).unwrap(); + } + + #[task] + fn foo(_: foo::Context) { + hprintln!("foo @ {:?}", Instant::now()).unwrap(); + } + + #[task] + fn bar(_: bar::Context) { + hprintln!("bar @ {:?}", Instant::now()).unwrap(); + } + + extern "C" { + fn EXTI0(); + } +}; -- GitLab