diff options
Diffstat (limited to 'examples/preemption.rs')
-rw-r--r-- | examples/preemption.rs | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/examples/preemption.rs b/examples/preemption.rs new file mode 100644 index 00000000..2ca6f951 --- /dev/null +++ b/examples/preemption.rs @@ -0,0 +1,70 @@ +//! Two tasks running at different priorities with access to the same resource + +#![deny(unsafe_code)] +#![feature(const_fn)] +#![feature(proc_macro)] +#![no_std] + +#[macro_use(task)] +extern crate cortex_m_rtfm as rtfm; +extern crate stm32f103xx; + +use rtfm::{app, Resource, Threshold}; + +app! { + device: stm32f103xx, + + resources: { + static COUNTER: u64 = 0; + }, + + tasks: { + // the task `SYS_TICK` has higher priority than `TIM2` + SYS_TICK: { + priority: 2, + resources: [COUNTER], + }, + + TIM2: { + enabled: true, + priority: 1, + resources: [COUNTER], + }, + }, +} + +fn init(_p: init::Peripherals, _r: init::Resources) { + // .. +} + +fn idle() -> ! { + loop { + rtfm::wfi(); + } +} + +task!(SYS_TICK, sys_tick); + +fn sys_tick(_t: &mut Threshold, r: SYS_TICK::Resources) { + // .. + + // this task can't be preempted by `tim2` so it has direct access to the + // resource data + **r.COUNTER += 1; + + // .. +} + +task!(TIM2, tim2); + +fn tim2(t: &mut Threshold, mut r: TIM2::Resources) { + // .. + + // as this task runs at lower priority it needs a critical section to + // prevent `sys_tick` from preempting it while it modifies this resource + // data. The critical section is required to prevent data races which can + // lead to data corruption or data loss + r.COUNTER.claim_mut(t, |counter, _t| { **counter += 1; }); + + // .. +} |