aboutsummaryrefslogtreecommitdiff
path: root/examples
diff options
context:
space:
mode:
authorGravatar Jorge Aparicio <jorge@japaric.io> 2019-04-22 22:21:46 +0200
committerGravatar Jorge Aparicio <jorge@japaric.io> 2019-05-01 21:32:00 +0200
commitccd7f4586b63841c4bac51f24dc38570c9f89726 (patch)
treec0839773ab356bac429cbc69e4f6b5654d162d6e /examples
parent485601245ba80488193adda7dc6d5bdef337384a (diff)
downloadrtic-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.rs67
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();
+ }
+};