41 lines
807 B
Rust
41 lines
807 B
Rust
use core::sync::atomic::{AtomicBool, Ordering};
|
|
|
|
const N: i32 = 10;
|
|
rt::semaphore!(SEM);
|
|
|
|
fn poster() {
|
|
rt::task::drop_privilege();
|
|
for _ in 0..N {
|
|
rt::task::sleep(5);
|
|
SEM.post();
|
|
}
|
|
|
|
rt::task::sleep(15);
|
|
SEM.post();
|
|
}
|
|
|
|
static WAIT_FAILED: AtomicBool = AtomicBool::new(false);
|
|
|
|
fn waiter() {
|
|
rt::task::drop_privilege();
|
|
for _ in 0..N {
|
|
if !SEM.timed_wait(10) {
|
|
WAIT_FAILED.store(true, Ordering::Relaxed);
|
|
}
|
|
}
|
|
|
|
if SEM.timed_wait(10) {
|
|
WAIT_FAILED.store(true, Ordering::Relaxed);
|
|
}
|
|
rt::stop();
|
|
}
|
|
|
|
fn main() {
|
|
rt::task!(poster, rt::task::STACK_MIN, 1);
|
|
rt::task!(waiter, rt::task::STACK_MIN, 1);
|
|
rt::start();
|
|
if WAIT_FAILED.load(Ordering::Relaxed) {
|
|
panic!("semaphore wait failed");
|
|
}
|
|
}
|