aboutsummaryrefslogtreecommitdiff
path: root/examples/full-syntax.rs
diff options
context:
space:
mode:
Diffstat (limited to 'examples/full-syntax.rs')
-rw-r--r--examples/full-syntax.rs81
1 files changed, 81 insertions, 0 deletions
diff --git a/examples/full-syntax.rs b/examples/full-syntax.rs
new file mode 100644
index 00000000..d1466781
--- /dev/null
+++ b/examples/full-syntax.rs
@@ -0,0 +1,81 @@
+//! A showcase of the `app!` macro syntax
+
+#![deny(unsafe_code)]
+#![feature(const_fn)]
+#![feature(proc_macro)]
+#![no_std]
+
+#[macro_use(task)]
+extern crate cortex_m_rtfm as rtfm;
+extern crate stm32f103xx;
+
+use rtfm::{app, Resource, Threshold};
+
+app! {
+ device: stm32f103xx,
+
+ resources: {
+ static CO_OWNED: u32 = 0;
+ static OWNED: bool = false;
+ static SHARED: bool = false;
+ },
+
+ init: {
+ path: init_, // this is a path to the "init" function
+ },
+
+ idle: {
+ locals: {
+ static COUNTER: u32 = 0;
+ },
+ path: idle_, // this is a path to the "idle" function
+ resources: [OWNED, SHARED],
+ },
+
+ tasks: {
+ SYS_TICK: {
+ priority: 1,
+ resources: [CO_OWNED, SHARED],
+ },
+
+ TIM2: {
+ enabled: true,
+ priority: 1,
+ resources: [CO_OWNED],
+ },
+ },
+}
+
+fn init_(_p: init::Peripherals, _r: init::Resources) {}
+
+fn idle_(t: &mut Threshold, l: &mut idle::Locals, mut r: idle::Resources) -> ! {
+ loop {
+ *l.COUNTER += 1;
+
+ **r.OWNED != **r.OWNED;
+
+ if **r.OWNED {
+ if r.SHARED.claim(t, |shared, _| **shared) {
+ rtfm::wfi();
+ }
+ } else {
+ r.SHARED.claim_mut(t, |shared, _| **shared = !**shared);
+ }
+ }
+}
+
+task!(SYS_TICK, sys_tick, Local {
+ static STATE: bool = true;
+});
+
+fn sys_tick(_t: &mut Threshold, l: &mut Local, r: SYS_TICK::Resources) {
+ *l.STATE = !*l.STATE;
+
+ **r.CO_OWNED += 1;
+}
+
+task!(TIM2, tim2);
+
+fn tim2(_t: &mut Threshold, r: TIM2::Resources) {
+ **r.CO_OWNED += 1;
+}