From 243668df5424e047dbfe8c4151eef5c7ebc88dc1 Mon Sep 17 00:00:00 2001 From: Emil Fresk Date: Sat, 14 Nov 2020 16:02:36 +0100 Subject: Multilock support --- examples/multilock.rs | 77 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 examples/multilock.rs (limited to 'examples') diff --git a/examples/multilock.rs b/examples/multilock.rs new file mode 100644 index 0000000..99d26ad --- /dev/null +++ b/examples/multilock.rs @@ -0,0 +1,77 @@ +//! examples/mutlilock.rs +//! +//! The multi-lock feature example. + +#![deny(unsafe_code)] +#![deny(warnings)] +#![no_main] +#![no_std] + +use panic_semihosting as _; + +#[rtic::app(device = lm3s6965, dispatchers = [GPIOA])] +mod app { + use cortex_m_semihosting::{debug, hprintln}; + + #[resources] + struct Resources { + #[init(0)] + shared1: u32, + #[init(0)] + shared2: u32, + #[init(0)] + shared3: u32, + } + + #[init] + fn init(_: init::Context) -> init::LateResources { + locks::spawn().ok(); + + init::LateResources {} + } + + // when omitted priority is assumed to be `1` + #[task(resources = [shared1, shared2, shared3])] + fn locks(c: locks::Context) { + let mut s1 = c.resources.shared1; + let mut s2 = c.resources.shared2; + let mut s3 = c.resources.shared3; + + hprintln!("Multiple single locks").unwrap(); + s1.lock(|s1| { + s2.lock(|s2| { + s3.lock(|s3| { + *s1 += 1; + *s2 += 1; + *s3 += 1; + + hprintln!( + "Multiple single locks, s1: {}, s2: {}, s3: {}", + *s1, + *s2, + *s3 + ) + .unwrap(); + }) + }) + }); + + hprintln!("Multilock!").unwrap(); + + (s1, s2, s3).lock(|s1, s2, s3| { + *s1 += 1; + *s2 += 1; + *s3 += 1; + + hprintln!( + "Multiple single locks, s1: {}, s2: {}, s3: {}", + *s1, + *s2, + *s3 + ) + .unwrap(); + }); + + debug::exit(debug::EXIT_SUCCESS); + } +} -- cgit v1.2.3 From f111c825ba3ab886a1a6bf63a0689c3d63b0f441 Mon Sep 17 00:00:00 2001 From: Emil Fresk Date: Sat, 14 Nov 2020 16:18:18 +0100 Subject: Added multilock to CI --- examples/multilock.rs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'examples') diff --git a/examples/multilock.rs b/examples/multilock.rs index 99d26ad..a6985df 100644 --- a/examples/multilock.rs +++ b/examples/multilock.rs @@ -9,9 +9,10 @@ use panic_semihosting as _; -#[rtic::app(device = lm3s6965, dispatchers = [GPIOA])] +#[rtic::app(device = lm3s6965)] mod app { use cortex_m_semihosting::{debug, hprintln}; + use lm3s6965::Interrupt; #[resources] struct Resources { @@ -25,13 +26,13 @@ mod app { #[init] fn init(_: init::Context) -> init::LateResources { - locks::spawn().ok(); + rtic::pend(Interrupt::GPIOA); init::LateResources {} } // when omitted priority is assumed to be `1` - #[task(resources = [shared1, shared2, shared3])] + #[task(binds = GPIOA, resources = [shared1, shared2, shared3])] fn locks(c: locks::Context) { let mut s1 = c.resources.shared1; let mut s2 = c.resources.shared2; -- cgit v1.2.3