diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/examples/_1_one_task.rs | 19 | ||||
-rw-r--r-- | src/examples/_2_two_tasks.rs | 4 | ||||
-rw-r--r-- | src/examples/_3_preemption.rs | 8 | ||||
-rw-r--r-- | src/examples/_4_nested.rs | 14 | ||||
-rw-r--r-- | src/examples/_6_full_syntax.rs | 1 | ||||
-rw-r--r-- | src/lib.rs | 32 |
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] //! @@ -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, |