rt/rust/examples/queue.rs

49 lines
1.1 KiB
Rust

#![no_main]
use core::sync::atomic::{AtomicUsize, Ordering};
rt::queue!(QUEUE, u32, 10);
fn pusher(mut i: u32) {
rt::task::drop_privilege();
loop {
QUEUE.push(i);
i += 1;
}
}
const NPUSHERS: usize = 2;
const TASK_INC: u32 = 0x1000000;
static NUM_POPPED: AtomicUsize = AtomicUsize::new(0);
fn popper() {
rt::task::drop_privilege();
let mut x: u32;
let mut max_elems = [0u32; NPUSHERS];
loop {
x = QUEUE.pop();
NUM_POPPED.fetch_add(1, Ordering::Relaxed);
let task = x / TASK_INC;
let elem = x % TASK_INC;
if let Some(max_elem) = max_elems.get_mut(task as usize) {
assert!(
elem >= *max_elem,
"queue elements were received out of order"
);
*max_elem = elem;
}
}
}
fn timeout() {
rt::task::drop_privilege();
rt::task::sleep(1000);
rt::trap();
}
rt::task!(pusher(0), rt::task::STACK_MIN, 1);
rt::task!(pusher(TASK_INC), rt::task::STACK_MIN, 1);
rt::task!(popper, rt::task::STACK_MIN, 1);
rt::task!(timeout, rt::task::STACK_MIN, 0);