52 lines
1.2 KiB
Rust
52 lines
1.2 KiB
Rust
use core::sync::atomic::{AtomicBool, 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 OUT_OF_ORDER: AtomicBool = AtomicBool::new(false);
|
|
static NUM_POPPED: AtomicUsize = AtomicUsize::new(0);
|
|
|
|
fn popper() {
|
|
rt::task::drop_privilege();
|
|
let mut x: u32;
|
|
let mut max_elem = [0u32; NPUSHERS];
|
|
loop {
|
|
x = QUEUE.pop();
|
|
NUM_POPPED.fetch_add(1, Ordering::Relaxed);
|
|
let task = x / TASK_INC;
|
|
let elem = x % TASK_INC;
|
|
if elem < max_elem[task as usize] {
|
|
OUT_OF_ORDER.store(true, Ordering::Release);
|
|
}
|
|
max_elem[task as usize] = elem;
|
|
}
|
|
}
|
|
|
|
fn timeout() {
|
|
rt::task::drop_privilege();
|
|
rt::task::sleep(1000);
|
|
rt::stop();
|
|
}
|
|
|
|
fn main() {
|
|
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, 2);
|
|
rt::start();
|
|
|
|
if OUT_OF_ORDER.load(Ordering::Acquire) {
|
|
panic!("queue elements were received out of order");
|
|
}
|
|
}
|