diff options
author | 2019-04-22 22:21:46 +0200 | |
---|---|---|
committer | 2019-05-01 21:32:00 +0200 | |
commit | ccd7f4586b63841c4bac51f24dc38570c9f89726 (patch) | |
tree | c0839773ab356bac429cbc69e4f6b5654d162d6e /examples | |
parent | 485601245ba80488193adda7dc6d5bdef337384a (diff) | |
download | rtic-ccd7f4586b63841c4bac51f24dc38570c9f89726.tar.gz rtic-ccd7f4586b63841c4bac51f24dc38570c9f89726.tar.zst rtic-ccd7f4586b63841c4bac51f24dc38570c9f89726.zip |
book: indirection for faster message passing
Diffstat (limited to 'examples')
-rw-r--r-- | examples/pool.rs | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/examples/pool.rs b/examples/pool.rs new file mode 100644 index 00000000..0b594b19 --- /dev/null +++ b/examples/pool.rs @@ -0,0 +1,67 @@ +//! examples/pool.rs + +#![deny(unsafe_code)] +#![deny(warnings)] +#![no_main] +#![no_std] + +extern crate panic_semihosting; + +use cortex_m_semihosting::{debug, hprintln}; +use heapless::{ + pool, + pool::singleton::{Box, Pool}, +}; +use lm3s6965::Interrupt; +use rtfm::app; + +// Declare a pool of 128-byte memory blocks +pool!(P: [u8; 128]); + +#[app(device = lm3s6965)] +const APP: () = { + #[init] + fn init(_: init::Context) { + static mut MEMORY: [u8; 512] = [0; 512]; + + // Increase the capacity of the memory pool by ~4 + P::grow(MEMORY); + + rtfm::pend(Interrupt::I2C0); + } + + #[interrupt(priority = 2, spawn = [foo, bar])] + fn I2C0(c: I2C0::Context) { + // claim a memory block, leave it uninitialized and .. + let x = P::alloc().unwrap().freeze(); + + // .. send it to the `foo` task + c.spawn.foo(x).ok().unwrap(); + + // send another block to the task `bar` + c.spawn.bar(P::alloc().unwrap().freeze()).ok().unwrap(); + } + + #[task] + fn foo(_: foo::Context, x: Box<P>) { + hprintln!("foo({:?})", x.as_ptr()).unwrap(); + + // explicitly return the block to the pool + drop(x); + + debug::exit(debug::EXIT_SUCCESS); + } + + #[task(priority = 2)] + fn bar(_: bar::Context, x: Box<P>) { + hprintln!("bar({:?})", x.as_ptr()).unwrap(); + + // this is done automatically so we can omit the call to `drop` + // drop(x); + } + + extern "C" { + fn UART0(); + fn UART1(); + } +}; |