Skip to content
Snippets Groups Projects
Select Git revision
  • c5bf36b0e3e1aea41e95b43ec3434134d40d6d27
  • master default
  • v0.1.0
3 results

lib.rs

Blame
  • two-tasks.rs 1.58 KiB
    //! Two tasks running at the same priority with access to the same resource
    
    #![deny(unsafe_code)]
    #![feature(const_fn)]
    #![feature(proc_macro)]
    #![no_std]
    
    extern crate cortex_m_rtfm as rtfm;
    extern crate stm32f103xx;
    
    use rtfm::{app, Threshold};
    
    app! {
        device: stm32f103xx,
    
        // Resources that are plain data, not peripherals
        resources: {
            // Declaration of resources looks like the declaration of `static`
            // variables
            static COUNTER: u64 = 0;
        },
    
        tasks: {
            SYS_TICK: {
                path: sys_tick,
                priority: 1,
                // Both this task and TIM2 have access to the `COUNTER` resource
                resources: [COUNTER],
            },
    
            // An interrupt as a task
            TIM2: {
                // For interrupts the `enabled` field must be specified. It
                // indicates if the interrupt will be enabled or disabled once
                // `idle` starts
                enabled: true,
                path: tim2,
                priority: 1,
                resources: [COUNTER],
            },
        },
    }
    
    // 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) {
        // ..
    }
    
    fn idle() -> ! {
        loop {
            rtfm::wfi();
        }
    }
    
    // As both tasks are running at the same priority one can't preempt the other.
    // Thus both tasks have direct access to the resource
    fn sys_tick(_t: &mut Threshold, r: SYS_TICK::Resources) {
        // ..
    
        **r.COUNTER += 1;
    
        // ..
    }
    
    fn tim2(_t: &mut Threshold, r: TIM2::Resources) {
        // ..
    
        **r.COUNTER += 1;
    
        // ..
    }