aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/examples/_1_one_task.rs19
-rw-r--r--src/examples/_2_two_tasks.rs4
-rw-r--r--src/examples/_3_preemption.rs8
-rw-r--r--src/examples/_4_nested.rs14
-rw-r--r--src/examples/_6_full_syntax.rs1
-rw-r--r--src/lib.rs32
6 files changed, 33 insertions, 45 deletions
diff --git a/src/examples/_1_one_task.rs b/src/examples/_1_one_task.rs
index 1bccc219..614db2aa 100644
--- a/src/examples/_1_one_task.rs
+++ b/src/examples/_1_one_task.rs
@@ -2,7 +2,6 @@
//!
//! ```
//! #![deny(unsafe_code)]
-//! #![feature(const_fn)]
//! #![feature(proc_macro)]
//! #![no_std]
//!
@@ -36,17 +35,6 @@
//! // Path to the task handler
//! path: sys_tick,
//!
-//! // This is the priority of the task.
-//! //
-//! // 1 is the lowest priority a task can have, and the maximum
-//! // priority is determined by the number of priority bits the device
-//! // has. `stm32f103xx` has 4 priority bits so 16 is the maximum valid
-//! // value.
-//! //
-//! // You can omit this field. If you do the priority is assumed to be
-//! // 1.
-//! priority: 1,
-//!
//! // These are the resources this task has access to.
//! //
//! // A resource can be a peripheral like `GPIOC` or a static variable
@@ -56,7 +44,10 @@
//! }
//! }
//!
-//! fn init(p: init::Peripherals, _r: init::Resources) {
+//! fn init(p: init::Peripherals, r: init::Resources) {
+//! // `init` can modify all the `resources` declared in `app!`
+//! r.ON;
+//!
//! // power on GPIOC
//! p.RCC.apb2enr.modify(|_, w| w.iopcen().enabled());
//!
@@ -83,7 +74,7 @@
//! //
//! // `_t` is the preemption threshold token. We won't use it in this program.
//! //
-//! // `r` is the set of resources this task has access to. `TIMER0_A1::Resources`
+//! // `r` is the set of resources this task has access to. `SYS_TICK::Resources`
//! // has one field per resource declared in `app!`.
//! fn sys_tick(_t: &mut Threshold, r: SYS_TICK::Resources) {
//! // toggle state
diff --git a/src/examples/_2_two_tasks.rs b/src/examples/_2_two_tasks.rs
index 451293cf..5db991b0 100644
--- a/src/examples/_2_two_tasks.rs
+++ b/src/examples/_2_two_tasks.rs
@@ -1,9 +1,7 @@
//! Two tasks running at the *same* priority with access to the same resource
//!
//! ```
-//!
//! #![deny(unsafe_code)]
-//! #![feature(const_fn)]
//! #![feature(proc_macro)]
//! #![no_std]
//!
@@ -33,8 +31,6 @@
//! },
//! }
//!
-//! // When data resources are declared in the top `resources` field, `init` will
-//! // have full access to them
//! fn init(_p: init::Peripherals, _r: init::Resources) {
//! // ..
//! }
diff --git a/src/examples/_3_preemption.rs b/src/examples/_3_preemption.rs
index 1f6b244b..9dc8983b 100644
--- a/src/examples/_3_preemption.rs
+++ b/src/examples/_3_preemption.rs
@@ -2,7 +2,6 @@
//!
//! ```
//! #![deny(unsafe_code)]
-//! #![feature(const_fn)]
//! #![feature(proc_macro)]
//! #![no_std]
//!
@@ -60,8 +59,11 @@
//! // As this task runs at lower priority it needs a critical section to
//! // prevent `sys_tick` from preempting it while it modifies this resource
//! // data. The critical section is required to prevent data races which can
-//! // lead to undefined behavior
-//! r.COUNTER.claim_mut(t, |counter, _t| { **counter += 1; });
+//! // lead to undefined behavior.
+//! r.COUNTER.claim_mut(t, |counter, _t| {
+//! // `claim_mut` creates a critical section
+//! **counter += 1;
+//! });
//!
//! // ..
//! }
diff --git a/src/examples/_4_nested.rs b/src/examples/_4_nested.rs
index d0306210..94af0bee 100644
--- a/src/examples/_4_nested.rs
+++ b/src/examples/_4_nested.rs
@@ -5,7 +5,6 @@
//!
//! ```
//! #![deny(unsafe_code)]
-//! #![feature(const_fn)]
//! #![feature(proc_macro)]
//! #![no_std]
//!
@@ -61,13 +60,14 @@
//! }
//! }
//!
-//! fn exti0(t: &mut Threshold, r: EXTI0::Resources) {
+//! #[allow(non_snake_case)]
+//! fn exti0(
+//! t: &mut Threshold,
+//! EXTI0::Resources { mut LOW, mut HIGH }: EXTI0::Resources,
+//! ) {
//! // Because this task has a priority of 1 the preemption threshold `t` also
//! // starts at 1
//!
-//! let mut low = r.LOW;
-//! let mut high = r.HIGH;
-//!
//! // B
//! rtfm::bkpt();
//!
@@ -75,7 +75,7 @@
//! rtfm::set_pending(Interrupt::EXTI1); // ~> exti1
//!
//! // A claim creates a critical section
-//! low.claim_mut(t, |_low, t| {
+//! LOW.claim_mut(t, |_low, t| {
//! // This claim increases the preemption threshold to 2
//! //
//! // 2 is just high enough to not race with task `exti1` for access to the
@@ -96,7 +96,7 @@
//! rtfm::bkpt();
//!
//! // Claims can be nested
-//! high.claim_mut(t, |_high, _| {
+//! HIGH.claim_mut(t, |_high, _| {
//! // This claim increases the preemption threshold to 3
//!
//! // Now `exti2` can't preempt this task
diff --git a/src/examples/_6_full_syntax.rs b/src/examples/_6_full_syntax.rs
index 449bee6c..80520657 100644
--- a/src/examples/_6_full_syntax.rs
+++ b/src/examples/_6_full_syntax.rs
@@ -2,7 +2,6 @@
//!
//! ```
//! #![deny(unsafe_code)]
-//! #![feature(const_fn)]
//! #![feature(proc_macro)]
//! #![no_std]
//!
diff --git a/src/lib.rs b/src/lib.rs
index dc856596..6188ed31 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -1,5 +1,4 @@
-//! Real Time For the Masses (RTFM), a framework for building concurrent
-//! applications, for ARM Cortex-M microcontrollers
+//! Real Time For the Masses (RTFM) framework for ARM Cortex-M microcontrollers
//!
//! This crate is based on [the RTFM framework] created by the Embedded Systems
//! group at [LuleƄ University of Technology][ltu], led by Prof. Per Lindgren,
@@ -37,24 +36,24 @@
//!
//! # Dependencies
//!
-//! - A device crate generated using [`svd2rust`] v0.11.x. The input SVD file
-//! *must* contain [`<cpu>`] information.
-//! - A `start` lang time: Vanilla `main` must be supported in binary crates.
-//! You can use the [`cortex-m-rt`] crate to fulfill the requirement
+//! The application crate must depend on a device crate generated using
+//! [`svd2rust`] v0.11.x and the "rt" feature of that crate must be enabled. The
+//! SVD file used to generate the device crate *must* contain [`<cpu>`]
+//! information.
//!
//! [`svd2rust`]: https://docs.rs/svd2rust/0..0/svd2rust/
//! [`<cpu>`]: https://www.keil.com/pack/doc/CMSIS/SVD/html/elem_cpu.html
-//! [`cortex-m-rt`]: https://docs.rs/cortex-m-rt/0.3.0/cortex_m_rt/
+//!
+//! # More documentation
+//!
+//! The `app!` macro is documented [here](../cortex_m_rtfm_macros/fn.app.html).
//!
//! # Examples
//!
-//! In increasing grade of complexity, see the [examples](./examples/index.html)
+//! In increasing grade of complexity. See the [examples](./examples/index.html)
//! module.
#![deny(missing_docs)]
#![deny(warnings)]
-#![feature(asm)]
-#![feature(const_fn)]
-#![feature(optin_builtin_traits)]
#![feature(proc_macro)]
#![no_std]
@@ -74,7 +73,9 @@ use cortex_m::register::basepri;
pub mod examples;
-/// Executes the closure `f` in an interrupt free context
+/// Executes the closure `f` in a preemption free context
+///
+/// During the execution of the closure no task can preempt the current task.
pub fn atomic<R, F>(t: &mut Threshold, f: F) -> R
where
F: FnOnce(&mut Threshold) -> R,
@@ -127,11 +128,10 @@ where
}
}
-/// Sets an interrupt as pending
+/// Sets an interrupt, that is a task, as pending
///
-/// If the interrupt priority is high enough the interrupt will be serviced
-/// immediately, otherwise it will be serviced at some point after the current
-/// task ends.
+/// If the task priority is high enough the task will be serviced immediately,
+/// otherwise it will be serviced at some point after the current task ends.
pub fn set_pending<I>(interrupt: I)
where
I: Nr,