From 5805a05fac2fc5824009586b3ee2fd36dc27fbbf Mon Sep 17 00:00:00 2001 From: Jorge Aparicio Date: Thu, 22 Jul 2021 09:17:39 +0200 Subject: book/resources: rm #[task_local] mention; add #[lock_free] example the #[task_local] attribute was removed --- examples/lock-free.rs | 60 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 examples/lock-free.rs (limited to 'examples') diff --git a/examples/lock-free.rs b/examples/lock-free.rs new file mode 100644 index 0000000..db74c7d --- /dev/null +++ b/examples/lock-free.rs @@ -0,0 +1,60 @@ +//! examples/lock-free.rs + +#![deny(unsafe_code)] +#![deny(warnings)] +#![no_main] +#![no_std] + +use panic_semihosting as _; + +#[rtic::app(device = lm3s6965)] +mod app { + use cortex_m_semihosting::{debug, hprintln}; + use lm3s6965::Interrupt; + + #[shared] + struct Shared { + #[lock_free] // <- lock-free shared resource + counter: u64, + } + + #[local] + struct Local {} + + #[init] + fn init(_: init::Context) -> (Shared, Local, init::Monotonics) { + rtic::pend(Interrupt::GPIOA); + + (Shared { counter: 0 }, Local {}, init::Monotonics()) + } + + #[task(binds = GPIOA, shared = [counter])] // <- same priority + fn gpioa(c: gpioa::Context) { + hprintln!("GPIOA/start").unwrap(); + rtic::pend(Interrupt::GPIOB); + + *c.shared.counter += 1; // <- no lock API required + let counter = *c.shared.counter; + hprintln!(" GPIOA/counter = {}", counter).unwrap(); + + if counter == 5 { + debug::exit(debug::EXIT_SUCCESS); + } + hprintln!("GPIOA/end").unwrap(); + } + + #[task(binds = GPIOB, shared = [counter])] // <- same priority + fn gpiob(c: gpiob::Context) { + hprintln!("GPIOB/start").unwrap(); + rtic::pend(Interrupt::GPIOA); + + *c.shared.counter += 1; // <- no lock API required + let counter = *c.shared.counter; + hprintln!(" GPIOB/counter = {}", counter).unwrap(); + + if counter == 5 { + debug::exit(debug::EXIT_SUCCESS); + } + hprintln!("GPIOB/end").unwrap(); + } +} -- cgit v1.2.3