aboutsummaryrefslogtreecommitdiff
path: root/examples/t-schedule.rs
diff options
context:
space:
mode:
authorGravatar bors[bot] <26634292+bors[bot]@users.noreply.github.com> 2020-10-15 16:42:30 +0000
committerGravatar GitHub <noreply@github.com> 2020-10-15 16:42:30 +0000
commit355cb82d0693fe108ac28ec8a0d77e8aab4e6e06 (patch)
tree67c0eadf6d8a98a2691b816d46a5103d159d6bbc /examples/t-schedule.rs
parentf9303cef1cf5b2d57d26e7667289fbdccf959ea8 (diff)
parent6808cc7cdf1512a7b10dd43f268f430a676c606e (diff)
downloadrtic-355cb82d0693fe108ac28ec8a0d77e8aab4e6e06.tar.gz
rtic-355cb82d0693fe108ac28ec8a0d77e8aab4e6e06.tar.zst
rtic-355cb82d0693fe108ac28ec8a0d77e8aab4e6e06.zip
Merge #390
390: Spawn and schedule from anywhere r=AfoHT a=korken89 This PR moves RTIC to the spawn and schedule from anywhere syntax. Notable changes: * We do no longer support non-`Send` types. * Some extra code is generated as any task may spawn/schedule any task. However Rust/LLVM does a great job optimizing away non used instantiations (no real code-size difference observed). * Worst case priority inversion has increased, but it is now predictable. Upsides: * With this we should be able to support async/await. * RTIC tasks can now be callbacks (spawned and scheduled). * RTIC tasks can be stored. Needs the following PR to land first: https://github.com/rtic-rs/rtic-syntax/pull/34 The following now works: ```rust #[rtic::app(device = lm3s6965, monotonic = rtic::cyccnt::CYCCNT)] mod app { #[init] fn init(mut cx: init::Context) -> init::LateResources { // Init stuff... // New spawn syntax foo::spawn().unwrap(); // New schedule syntax bar::schedule(now + 4_000_000.cycles()).unwrap(); init::LateResources {} } #[task] fn foo(_: foo::Context) {} #[task] fn bar(_: bar::Context) {} extern "C" { fn SSI0(); } } ``` Co-authored-by: Per Lindgren <per.lindgren@ltu.se> Co-authored-by: Emil Fresk <emil.fresk@gmail.com>
Diffstat (limited to 'examples/t-schedule.rs')
-rw-r--r--examples/t-schedule.rs42
1 files changed, 21 insertions, 21 deletions
diff --git a/examples/t-schedule.rs b/examples/t-schedule.rs
index d5a6d3ff..7c2c420c 100644
--- a/examples/t-schedule.rs
+++ b/examples/t-schedule.rs
@@ -10,45 +10,45 @@ use rtic::cyccnt::{Instant, U32Ext as _};
#[rtic::app(device = lm3s6965, monotonic = rtic::cyccnt::CYCCNT)]
mod app {
- #[init(schedule = [foo, bar, baz])]
+ #[init]
fn init(c: init::Context) -> init::LateResources {
- let _: Result<(), ()> = c.schedule.foo(c.start + 10.cycles());
- let _: Result<(), u32> = c.schedule.bar(c.start + 20.cycles(), 0);
- let _: Result<(), (u32, u32)> = c.schedule.baz(c.start + 30.cycles(), 0, 1);
+ let _: Result<(), ()> = foo::schedule(c.start + 10.cycles());
+ let _: Result<(), u32> = bar::schedule(c.start + 20.cycles(), 0);
+ let _: Result<(), (u32, u32)> = baz::schedule(c.start + 30.cycles(), 0, 1);
init::LateResources {}
}
- #[idle(schedule = [foo, bar, baz])]
- fn idle(c: idle::Context) -> ! {
- let _: Result<(), ()> = c.schedule.foo(Instant::now() + 40.cycles());
- let _: Result<(), u32> = c.schedule.bar(Instant::now() + 50.cycles(), 0);
- let _: Result<(), (u32, u32)> = c.schedule.baz(Instant::now() + 60.cycles(), 0, 1);
+ #[idle]
+ fn idle(_: idle::Context) -> ! {
+ let _: Result<(), ()> = foo::schedule(Instant::now() + 40.cycles());
+ let _: Result<(), u32> = bar::schedule(Instant::now() + 50.cycles(), 0);
+ let _: Result<(), (u32, u32)> = baz::schedule(Instant::now() + 60.cycles(), 0, 1);
loop {
cortex_m::asm::nop();
}
}
- #[task(binds = SVCall, schedule = [foo, bar, baz])]
+ #[task(binds = SVCall)]
fn svcall(c: svcall::Context) {
- let _: Result<(), ()> = c.schedule.foo(c.start + 70.cycles());
- let _: Result<(), u32> = c.schedule.bar(c.start + 80.cycles(), 0);
- let _: Result<(), (u32, u32)> = c.schedule.baz(c.start + 90.cycles(), 0, 1);
+ let _: Result<(), ()> = foo::schedule(c.start + 70.cycles());
+ let _: Result<(), u32> = bar::schedule(c.start + 80.cycles(), 0);
+ let _: Result<(), (u32, u32)> = baz::schedule(c.start + 90.cycles(), 0, 1);
}
- #[task(binds = UART0, schedule = [foo, bar, baz])]
+ #[task(binds = UART0)]
fn uart0(c: uart0::Context) {
- let _: Result<(), ()> = c.schedule.foo(c.start + 100.cycles());
- let _: Result<(), u32> = c.schedule.bar(c.start + 110.cycles(), 0);
- let _: Result<(), (u32, u32)> = c.schedule.baz(c.start + 120.cycles(), 0, 1);
+ let _: Result<(), ()> = foo::schedule(c.start + 100.cycles());
+ let _: Result<(), u32> = bar::schedule(c.start + 110.cycles(), 0);
+ let _: Result<(), (u32, u32)> = baz::schedule(c.start + 120.cycles(), 0, 1);
}
- #[task(schedule = [foo, bar, baz])]
+ #[task]
fn foo(c: foo::Context) {
- let _: Result<(), ()> = c.schedule.foo(c.scheduled + 130.cycles());
- let _: Result<(), u32> = c.schedule.bar(c.scheduled + 140.cycles(), 0);
- let _: Result<(), (u32, u32)> = c.schedule.baz(c.scheduled + 150.cycles(), 0, 1);
+ let _: Result<(), ()> = foo::schedule(c.scheduled + 130.cycles());
+ let _: Result<(), u32> = bar::schedule(c.scheduled + 140.cycles(), 0);
+ let _: Result<(), (u32, u32)> = baz::schedule(c.scheduled + 150.cycles(), 0, 1);
}
#[task]