update examples

This commit is contained in:
Jorge Aparicio 2017-07-29 00:34:00 -05:00
parent e85d6e53c8
commit 2d80f3631b
18 changed files with 206 additions and 87 deletions

View file

@ -1,6 +1,5 @@
//! A showcase of the `app!` macro syntax
#![deny(unsafe_code)]
#![feature(const_fn)]
#![feature(proc_macro)]
#![no_std]

View file

@ -3,7 +3,6 @@
//! If you run this program you'll hit the breakpoints as indicated by the
//! letters in the comments: A, then B, then C, etc.
#![deny(unsafe_code)]
#![feature(const_fn)]
#![feature(proc_macro)]
#![no_std]
@ -59,13 +58,14 @@ fn idle() -> ! {
}
}
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();
@ -73,7 +73,7 @@ fn exti0(t: &mut Threshold, r: EXTI0::Resources) {
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
@ -94,7 +94,7 @@ fn exti0(t: &mut Threshold, r: EXTI0::Resources) {
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

View file

@ -1,6 +1,5 @@
//! An application with one task
#![deny(unsafe_code)]
#![feature(const_fn)]
#![feature(proc_macro)]
#![no_std]
@ -34,17 +33,6 @@ app! {
// 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
@ -54,7 +42,10 @@ app! {
}
}
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());
@ -81,7 +72,7 @@ fn idle() -> ! {
//
// `_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

View file

@ -1,6 +1,5 @@
//! Two tasks running at *different* priorities with access to the same resource
#![deny(unsafe_code)]
#![feature(const_fn)]
#![feature(proc_macro)]
#![no_std]
@ -58,8 +57,11 @@ fn tim2(t: &mut Threshold, mut r: TIM2::Resources) {
// 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;
});
// ..
}

View file

@ -1,7 +1,5 @@
//! Two tasks running at the *same* priority with access to the same resource
#![deny(unsafe_code)]
#![feature(const_fn)]
#![feature(proc_macro)]
#![no_std]
@ -31,8 +29,6 @@ app! {
},
}
// 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) {
// ..
}