mirror of
https://github.com/rtic-rs/rtic.git
synced 2025-12-16 21:05:35 +01:00
update examples
This commit is contained in:
parent
e85d6e53c8
commit
2d80f3631b
18 changed files with 206 additions and 87 deletions
|
|
@ -1,6 +1,5 @@
|
|||
//! A showcase of the `app!` macro syntax
|
||||
#![deny(unsafe_code)]
|
||||
#![feature(const_fn)]
|
||||
#![feature(proc_macro)]
|
||||
#![no_std]
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
});
|
||||
|
||||
// ..
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
// ..
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue