aboutsummaryrefslogtreecommitdiff
path: root/examples
diff options
context:
space:
mode:
Diffstat (limited to 'examples')
-rw-r--r--examples/lm3s6965/Cargo.lock3
-rw-r--r--examples/lm3s6965/Cargo.toml1
-rw-r--r--examples/lm3s6965/examples/pool.rs102
-rw-r--r--examples/lm3s6965/examples/pool.rs_old69
4 files changed, 105 insertions, 70 deletions
diff --git a/examples/lm3s6965/Cargo.lock b/examples/lm3s6965/Cargo.lock
index 696c606..076a156 100644
--- a/examples/lm3s6965/Cargo.lock
+++ b/examples/lm3s6965/Cargo.lock
@@ -354,7 +354,7 @@ dependencies = [
[[package]]
name = "rtic"
-version = "2.1.0"
+version = "2.1.1"
dependencies = [
"atomic-polyfill",
"bare-metal 1.0.0",
@@ -429,6 +429,7 @@ name = "rtic_lm3s6965"
version = "0.1.0"
dependencies = [
"bare-metal 1.0.0",
+ "cfg-if",
"cortex-m",
"cortex-m-semihosting",
"futures",
diff --git a/examples/lm3s6965/Cargo.toml b/examples/lm3s6965/Cargo.toml
index 86a7cbb..bfa4b29 100644
--- a/examples/lm3s6965/Cargo.toml
+++ b/examples/lm3s6965/Cargo.toml
@@ -18,6 +18,7 @@ rtic-time = { path = "../../rtic-time" }
rtic-sync = { path = "../../rtic-sync" }
rtic-monotonics = { path = "../../rtic-monotonics", features = ["cortex-m-systick"] }
rtic = { path = "../../rtic" }
+cfg-if = "1.0"
[dependencies.futures]
version = "0.3.26"
diff --git a/examples/lm3s6965/examples/pool.rs b/examples/lm3s6965/examples/pool.rs
new file mode 100644
index 0000000..ba04e62
--- /dev/null
+++ b/examples/lm3s6965/examples/pool.rs
@@ -0,0 +1,102 @@
+//! examples/pool.rs
+
+#![no_main]
+#![no_std]
+#![deny(warnings)]
+
+use panic_semihosting as _;
+use rtic::app;
+
+// thumbv6-none-eabi does not support pool
+// This might be better worked around in the build system,
+// but for proof of concept, let's try having one example
+// being different for different backends
+// https://docs.rs/heapless/0.8.0/heapless/pool/index.html#target-support
+cfg_if::cfg_if! {
+ if #[cfg(feature = "thumbv6-backend")] {
+ // Copy of the smallest.rs example
+ #[app(device = lm3s6965)]
+ mod app {
+ use cortex_m_semihosting::debug;
+
+ #[shared]
+ struct Shared {}
+
+ #[local]
+ struct Local {}
+
+ #[init]
+ fn init(_: init::Context) -> (Shared, Local) {
+ debug::exit(debug::EXIT_SUCCESS); // Exit QEMU simulator
+ (Shared {}, Local {})
+ }
+ }
+ } else {
+ // Run actual pool example
+ use heapless::{
+ box_pool,
+ pool::boxed::{Box, BoxBlock},
+ };
+
+ // Declare a pool containing 8-byte memory blocks
+ box_pool!(P: u8);
+
+ const POOL_CAPACITY: usize = 512;
+
+ #[app(device = lm3s6965, dispatchers = [SSI0, QEI0])]
+ mod app {
+ use crate::{Box, BoxBlock, POOL_CAPACITY};
+ use cortex_m_semihosting::debug;
+ use lm3s6965::Interrupt;
+
+ // Import the memory pool into scope
+ use crate::P;
+
+ #[shared]
+ struct Shared {}
+
+ #[local]
+ struct Local {}
+
+ const BLOCK: BoxBlock<u8> = BoxBlock::new();
+
+ #[init(local = [memory: [BoxBlock<u8>; POOL_CAPACITY] = [BLOCK; POOL_CAPACITY]])]
+ fn init(cx: init::Context) -> (Shared, Local) {
+ for block in cx.local.memory {
+ // Give the 'static memory to the pool
+ P.manage(block);
+ }
+
+ rtic::pend(Interrupt::I2C0);
+
+ (Shared {}, Local {})
+ }
+
+ #[task(binds = I2C0, priority = 2)]
+ fn i2c0(_: i2c0::Context) {
+ // Claim 128 u8 blocks
+ let x = P.alloc(128).unwrap();
+
+ // .. send it to the `foo` task
+ foo::spawn(x).ok().unwrap();
+
+ // send another 128 u8 blocks to the task `bar`
+ bar::spawn(P.alloc(128).unwrap()).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);
+ }
+ }
+ }
+}
diff --git a/examples/lm3s6965/examples/pool.rs_old b/examples/lm3s6965/examples/pool.rs_old
deleted file mode 100644
index b399202..0000000
--- a/examples/lm3s6965/examples/pool.rs_old
+++ /dev/null
@@ -1,69 +0,0 @@
-//! examples/pool.rs
-
-#![no_main]
-#![no_std]
-#![deny(warnings)]
-
-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)]
- 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);
- }
-}