2023-08-21 20:43:27 -07:00
|
|
|
#include <rt/assert.h>
|
2022-08-15 01:20:48 -07:00
|
|
|
#include <rt/sem.h>
|
2022-10-22 01:12:21 -07:00
|
|
|
#include <rt/task.h>
|
2023-10-07 12:48:02 -07:00
|
|
|
#include <rt/trap.h>
|
2022-08-14 22:29:42 -07:00
|
|
|
|
2022-08-16 01:37:04 -07:00
|
|
|
static const int n = 10;
|
2022-11-27 16:11:49 -08:00
|
|
|
static RT_SEM(sem, 0);
|
2022-08-14 22:29:42 -07:00
|
|
|
|
2022-12-05 22:43:38 -08:00
|
|
|
static void poster(void)
|
2022-08-14 22:29:42 -07:00
|
|
|
{
|
2023-05-13 17:42:46 -07:00
|
|
|
rt_task_drop_privilege();
|
2023-07-30 18:46:01 -07:00
|
|
|
for (int i = 0; i < n; ++i)
|
2022-08-14 22:29:42 -07:00
|
|
|
{
|
2023-07-26 23:39:25 -07:00
|
|
|
rt_task_sleep(5);
|
2022-11-27 16:11:49 -08:00
|
|
|
rt_sem_post(&sem);
|
2022-08-14 22:29:42 -07:00
|
|
|
}
|
2022-11-20 13:52:10 -08:00
|
|
|
|
2023-07-26 23:39:25 -07:00
|
|
|
rt_task_sleep(15);
|
2022-11-27 16:11:49 -08:00
|
|
|
rt_sem_post(&sem);
|
2022-08-14 22:29:42 -07:00
|
|
|
}
|
|
|
|
|
2022-12-05 22:43:38 -08:00
|
|
|
static void waiter(void)
|
2022-08-14 22:29:42 -07:00
|
|
|
{
|
2023-05-13 17:42:46 -07:00
|
|
|
rt_task_drop_privilege();
|
2023-07-30 18:46:01 -07:00
|
|
|
for (int i = 0; i < n; ++i)
|
2022-08-14 22:29:42 -07:00
|
|
|
{
|
2023-08-21 20:43:27 -07:00
|
|
|
rt_assert(rt_sem_timedwait(&sem, 10), "wait timed out");
|
2022-08-14 22:29:42 -07:00
|
|
|
}
|
2022-11-20 13:52:10 -08:00
|
|
|
|
2023-08-21 20:43:27 -07:00
|
|
|
rt_assert(!rt_sem_timedwait(&sem, 10), "wait didn't time out");
|
2022-11-20 13:52:10 -08:00
|
|
|
|
2023-10-07 12:48:02 -07:00
|
|
|
rt_trap();
|
2022-08-14 22:29:42 -07:00
|
|
|
}
|
|
|
|
|
2024-02-24 03:28:54 -08:00
|
|
|
RT_TASK(poster, RT_STACK_MIN, 0);
|
|
|
|
RT_TASK(waiter, RT_STACK_MIN, 0);
|