aboutsummaryrefslogtreecommitdiff
path: root/examples/pool.no_rs
diff options
context:
space:
mode:
Diffstat (limited to 'examples/pool.no_rs')
-rw-r--r--examples/pool.no_rs70
1 files changed, 70 insertions, 0 deletions
diff --git a/examples/pool.no_rs b/examples/pool.no_rs
new file mode 100644
index 00000000..fb8589ad
--- /dev/null
+++ b/examples/pool.no_rs
@@ -0,0 +1,70 @@
+//! examples/pool.rs
+
+#![deny(unsafe_code)]
+#![deny(warnings)]
+#![no_main]
+#![no_std]
+
+use heapless::{
+ pool,
+ pool::singleton::{Box, Pool},
+};
+use panic_semihosting as _;
+use rtic::app;
+
+// Declare a pool of 128-byte memory blocks
+pool!(P: [u8; 128]);
+
+#[app(device = lm3s6965, dispatchers = [SSI0, QEI0])]
+mod app {
+ use crate::{Box, Pool};
+ use cortex_m_semihosting::debug;
+ use lm3s6965::Interrupt;
+
+ // Import the memory pool into scope
+ use super::P;
+
+ #[shared]
+ struct Shared {}
+
+ #[local]
+ struct Local {}
+
+ #[init(local = [memory: [u8; 512] = [0; 512]])]
+ fn init(cx: init::Context) -> (Shared, Local) {
+ // Increase the capacity of the memory pool by ~4
+ P::grow(cx.local.memory);
+
+ rtic::pend(Interrupt::I2C0);
+
+ (Shared {}, Local {})
+ }
+
+ #[task(binds = I2C0, priority = 2)]
+ async fn i2c0(_: i2c0::Context) {
+ // claim a memory block, initialize it and ..
+ let x = P::alloc().unwrap().init([0u8; 128]);
+
+ // .. send it to the `foo` task
+ foo::spawn(x).ok().unwrap();
+
+ // send another block to the task `bar`
+ bar::spawn(P::alloc().unwrap().init([0u8; 128]))
+ .ok()
+ .unwrap();
+ }
+
+ #[task]
+ async fn foo(_: foo::Context, _x: Box<P>) {
+ // explicitly return the block to the pool
+ drop(_x);
+
+ debug::exit(debug::EXIT_SUCCESS); // Exit QEMU simulator
+ }
+
+ #[task(priority = 2)]
+ async fn bar(_: bar::Context, _x: Box<P>) {
+ // this is done automatically so we can omit the call to `drop`
+ // drop(_x);
+ }
+}