rt 0.19.1

A real-time operating system capable of full preemption
Documentation
#![no_main]
#![cfg_attr(target_os = "none", no_std)]

use core::sync::atomic::{AtomicBool, Ordering};

rt::mutex!(MUTEX, u32, 0);
rt::condvar!(COND);

static FLAG: AtomicBool = AtomicBool::new(false);

const ITERATIONS: i32 = 1000;

fn signaler() {
    rt::task::drop_privilege();
    loop {
        let _g = MUTEX.lock();
        FLAG.store(true, Ordering::Relaxed);
        COND.signal();
    }
}

fn incrementer() {
    rt::task::drop_privilege();
    let mut g = MUTEX.lock();
    for _ in 0..ITERATIONS {
        COND.wait_while(&g, |_| !FLAG.load(Ordering::Relaxed));
        *g += 1;
        FLAG.store(false, Ordering::Relaxed);
    }
    rt::exit();
}

fn timeout() {
    rt::task::sleep(1000);
    panic!("timed out");
}

const STACK_SIZE: usize = rt::stack::MIN * 4;

rt::task!(signaler, rt::stack::MIN, 2);
rt::task!(incrementer, rt::stack::MIN, 1);
rt::task!(incrementer, rt::stack::MIN, 1);
rt::task!(timeout, STACK_SIZE, 0);