diff options
author | 2021-07-22 07:29:35 +0000 | |
---|---|---|
committer | 2021-07-22 07:29:35 +0000 | |
commit | c62fd967d77ccf72c08ea720c21777e367ab4125 (patch) | |
tree | f0f469dcf5414577e088c0c606a334448e5d0bbe /examples/resource.rs | |
parent | 2f3b5cba805d7e7b736869249f46298e59bc944d (diff) | |
parent | 5805a05fac2fc5824009586b3ee2fd36dc27fbbf (diff) | |
download | rtic-c62fd967d77ccf72c08ea720c21777e367ab4125.tar.gz rtic-c62fd967d77ccf72c08ea720c21777e367ab4125.tar.zst rtic-c62fd967d77ccf72c08ea720c21777e367ab4125.zip |
Merge #498
498: book: update the resources chapter r=AfoHT a=japaric
see individual commit messages for details.
what's still left to do is adjust the very last section about `#[task_local]` and `#[lock_free]` but I plan to do that as a follow up. I didn't find an in-tree example for those two attributes (are they field attributes? where do they fit in the syntax?); a quick scan of the rtic-syntax crate seems to indicate that `task_local` has been removed (?) and that `lock_free` still exists.
Co-authored-by: Jorge Aparicio <jorge.aparicio@ferrous-systems.com>
Diffstat (limited to 'examples/resource.rs')
-rw-r--r-- | examples/resource.rs | 66 |
1 files changed, 40 insertions, 26 deletions
diff --git a/examples/resource.rs b/examples/resource.rs index 2c7dffe3..dca0b370 100644 --- a/examples/resource.rs +++ b/examples/resource.rs @@ -13,55 +13,69 @@ mod app { use lm3s6965::Interrupt; #[shared] - struct Shared { - shared: u32, - } + struct Shared {} #[local] - struct Local {} + struct Local { + local_to_uart0: i64, + local_to_uart1: i64, + } #[init] fn init(_: init::Context) -> (Shared, Local, init::Monotonics) { rtic::pend(Interrupt::UART0); rtic::pend(Interrupt::UART1); - (Shared { shared: 0 }, Local {}, init::Monotonics()) + ( + Shared {}, + // initial values for the `#[local]` resources + Local { + local_to_uart0: 0, + local_to_uart1: 0, + }, + init::Monotonics(), + ) } - // `shared` cannot be accessed from this context + // `#[local]` resources cannot be accessed from this context #[idle] fn idle(_cx: idle::Context) -> ! { debug::exit(debug::EXIT_SUCCESS); - // error: no `shared` field in `idle::Context` - // _cx.shared.shared += 1; + // error: no `local` field in `idle::Context` + // _cx.local.local_to_uart0 += 1; + + // error: no `local` field in `idle::Context` + // _cx.local.local_to_uart1 += 1; loop { cortex_m::asm::nop(); } } - // `shared` can be accessed from this context + // `local_to_uart0` can only be accessed from this context // defaults to priority 1 - #[task(binds = UART0, shared = [shared])] - fn uart0(mut cx: uart0::Context) { - let shared = cx.shared.shared.lock(|shared| { - *shared += 1; - *shared - }); - - hprintln!("UART0: shared = {}", shared).unwrap(); + #[task(binds = UART0, local = [local_to_uart0])] + fn uart0(cx: uart0::Context) { + *cx.local.local_to_uart0 += 1; + let local_to_uart0 = cx.local.local_to_uart0; + + // error: no `local_to_uart1` field in `uart0::LocalResources` + // cx.local.local_to_uart1 += 1; + + hprintln!("UART0: local_to_uart0 = {}", local_to_uart0).unwrap(); } - // `shared` can be accessed from this context + // `shared` can only be accessed from this context // explicitly set to priority 2 - #[task(binds = UART1, shared = [shared], priority = 2)] - fn uart1(mut cx: uart1::Context) { - let shared = cx.shared.shared.lock(|shared| { - *shared += 1; - *shared - }); - - hprintln!("UART1: shared = {}", shared).unwrap(); + #[task(binds = UART1, local = [local_to_uart1], priority = 2)] + fn uart1(cx: uart1::Context) { + *cx.local.local_to_uart1 += 1; + let local_to_uart1 = cx.local.local_to_uart1; + + // error: no `local_to_uart0` field in `uart1::LocalResources` + // cx.local.local_to_uart0 += 1; + + hprintln!("UART1: local_to_uart1 = {}", local_to_uart1).unwrap(); } } |