Module f3::examples::_12_preemptive
[−]
[src]
Preemptive multitasking
This programs runs the roulette
and serial-echo
examples as concurrent tasks using
preemption. The serial-echo
task is given higher priority and can preempt the other task.
This example uses the Real Time For the Masses framework
#![deny(unsafe_code)] #![deny(warnings)] #![feature(proc_macro)] #![no_std] extern crate cortex_m_rtfm as rtfm; extern crate f3; use f3::hal::delay::Delay; use f3::hal::prelude::*; use f3::hal::serial::{Event, Rx, Serial, Tx}; use f3::hal::stm32f30x::{self, USART1}; use f3::led::Leds; use rtfm::{app, Threshold}; app! { device: stm32f30x, resources: { static DELAY: Delay; static LEDS: Leds; static RX: Rx<USART1>; static TX: Tx<USART1>; }, idle: { resources: [DELAY, LEDS], }, tasks: { USART1_EXTI25: { path: echo, resources: [TX, RX], } }, } fn init(p: init::Peripherals) -> init::LateResources { let mut flash = p.device.FLASH.constrain(); let mut rcc = p.device.RCC.constrain(); let mut gpioa = p.device.GPIOA.split(&mut rcc.ahb); let clocks = rcc.cfgr.freeze(&mut flash.acr); let delay = Delay::new(p.core.SYST, clocks); let leds = Leds::new(p.device.GPIOE.split(&mut rcc.ahb)); let tx = gpioa.pa9.into_af7(&mut gpioa.moder, &mut gpioa.afrh); let rx = gpioa.pa10.into_af7(&mut gpioa.moder, &mut gpioa.afrh); let mut serial = Serial::usart1( p.device.USART1, (tx, rx), 115_200.bps(), clocks, &mut rcc.apb2, ); serial.listen(Event::Rxne); let (tx, rx) = serial.split(); init::LateResources { DELAY: delay, LEDS: leds, RX: rx, TX: tx, } } fn idle(_t: &mut Threshold, r: idle::Resources) -> ! { loop { let n = r.LEDS.len(); for curr in 0..n { let next = (curr + 1) % n; r.LEDS[curr].off(); r.LEDS[next].on(); r.DELAY.delay_ms(125_u8); } } } fn echo(_: &mut Threshold, mut r: USART1_EXTI25::Resources) { let byte = r.RX.read().unwrap(); r.TX.write(byte).unwrap(); }