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::{AtomicUsize, Ordering};

const ITERATIONS: usize = 100;

rt::once!(ONCE);
rt::sem!(SEM);

static X: AtomicUsize = AtomicUsize::new(0);

fn f() {
    X.fetch_add(1, Ordering::Relaxed);
}

fn oncer() {
    rt::task::drop_privilege();
    for _ in 0..ITERATIONS {
        ONCE.call_once(f);
    }
}

fn oncer_exit() {
    oncer();
    assert_eq!(
        X.load(Ordering::Relaxed),
        1,
        "X did not have the expected value"
    );
    rt::exit();
}

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

rt::task!(oncer, rt::stack::MIN, 0);
rt::task!(oncer_exit, STACK_SIZE, 0);