Inter-task notification mechanism based on discrete flags.
基于离散标志的任务间通知机制。
事件标志组是一个由长字结构表示的同步对象;这个字中的每一个可用位都代表一个用户定义的事件标志。
当一个位被设置时,表示相关联的事件已经发生。Xenomai任务可以使用这种机制向其他任务标志特定事件的发生。
任务可以以合取方式(所有等待的事件都必须发生才能满足等待请求)或析取方式(至少有一个等待的事件发生才能满足等待请求)等待事件的发生。
int aori_event_bind (AORI_RT_EVENT *event, const char *name, RTIME timeout);
绑定到一个事件标志组。
此例程创建一个新的描述符来引用由其符号名称标识的现有事件标志组。如果对象在进入时不存在,调用者可能会阻塞,直到创建具有给定名称的事件标志组。
参数
返回值
成功时返回零。否则:
标签
xthread-nowait, switch-primary
注意
超时值被解释为 Alchemy 时钟分辨率的倍数(参见 alchemy-clock-resolution 选项,默认为1纳秒)。
{{% details title="示例代码" closed="true" %}}
#include <aori/rt/event.h>
#include <aori/rt/task.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define TASK_PRIO 20
#define TASK_MODE AORI_RT_TASK_MODE_JOINABLE
#define TASK_STKSZ 0
#define EVENT_FLAG 0x99 // 定义使用的事件标志
AORI_RT_EVENT event_desc;
void signal_task(void *arg) {
int ret;
AORI_RT_EVENT event_signal;
printf("Signal Task: Sleeping for 1 seconds before sending signal\n");
aori_task_sleep(1000000000); // 休眠1秒
ret = aori_event_bind(&event_signal, "MyEvent", AORI_RT_TM_INFINITE);
if (ret) {
fprintf(stderr, "Failed to bind event: %s\n", strerror(-ret));
return;
}
printf("Signal Task: Sending signal\n");
ret = aori_event_signal(&event_desc, EVENT_FLAG);
if (ret) {
fprintf(stderr, "Signal Task: Failed to signal event, code %d\n", ret);
} else {
printf("Signal Task: Event signaled successfully\n");
}
aori_event_unbind(&event_signal);
}
void wait_task(void *arg) {
int ret;
unsigned int received_mask;
printf("Wait Task: Waiting for event\n");
ret = aori_event_wait(&event_desc, EVENT_FLAG, &received_mask, EAORI_RT_EV_ALL, AORI_RT_TM_INFINITE);
if (ret) {
fprintf(stderr, "Wait Task: Failed to wait for event, code %d\n", ret);
} else {
printf("Wait Task: Event received, mask: 0x%x\n", received_mask);
}
}
int main(int argc, char *argv[]) {
AORI_RT_TASK signal_task_desc, wait_task_desc;
int ret;
// 创建事件标志组
ret = aori_event_create(&event_desc, "MyEvent", 0, EAORI_RT_EV_PRIO);
if (ret) {
fprintf(stderr, "Failed to create event flag group, code %d\n", ret);
return EXIT_FAILURE;
}
// 创建等待任务
ret = aori_task_create(&wait_task_desc, "WaitTask", TASK_STKSZ, TASK_PRIO, TASK_MODE);
if (ret) {
fprintf(stderr, "Failed to create wait task, code %d\n", ret);
return EXIT_FAILURE;
}
// 创建信号任务
ret = aori_task_create(&signal_task_desc, "SignalTask", TASK_STKSZ, TASK_PRIO, TASK_MODE);
if (ret) {
fprintf(stderr, "Failed to create signal task, code %d\n", ret);
return EXIT_FAILURE;
}
// 启动任务
aori_task_start(&wait_task_desc, &wait_task, NULL);
aori_task_start(&signal_task_desc, &signal_task, NULL);
// 等待任务结束并清理
aori_task_join(&wait_task_desc);
aori_task_join(&signal_task_desc);
aori_event_delete(&event_desc);
return EXIT_SUCCESS;
}
{{% /details %}}
int aori_event_create(AORI_RT_EVENT *event, const char *name, unsigned int ivalue, AORI_RT_EVENT_CREATE_MODE mode)
创建一个事件标志组。
事件组通过允许一组标志(或"事件")被原子性地等待和发布,为任务同步提供了支持。一个事件组包含了已接收事件的掩码;在单个操作中,可以挂起或发布任意集合的事件标志。
参数
EV_FIFO 使任务按FIFO顺序在事件标志组上挂起。
EV_PRIO 使任务按优先级顺序在事件标志组上挂起。
返回值
成功时返回零。否则:
标签
xthread-only, mode-unrestricted, switch-secondary
注意
事件标志组可以由属于同一Xenomai会话的多个进程共享。
{{% details title="示例代码" closed="true" %}}
#include <aori/rt/event.h>
#include <aori/rt/task.h>
#include <stdio.h>
#include <stdlib.h>
#define TASK_PRIO 20
#define TASK_MODE AORI_RT_TASK_MODE_JOINABLE
#define TASK_STKSZ 0
#define EVENT_FLAG 0x99 // 定义使用的事件标志
AORI_RT_EVENT event_desc;
void signal_task(void *arg) {
int ret;
printf("Signal Task: Sleeping for 1 seconds before sending signal\n");
aori_task_sleep(1000000000); // 休眠1秒
printf("Signal Task: Sending signal\n");
ret = aori_event_signal(&event_desc, EVENT_FLAG);
if (ret) {
fprintf(stderr, "Signal Task: Failed to signal event, code %d\n", ret);
} else {
printf("Signal Task: Event signaled successfully\n");
}
}
void wait_task(void *arg) {
int ret;
unsigned int received_mask;
printf("Wait Task: Waiting for event\n");
ret = aori_event_wait(&event_desc, EVENT_FLAG, &received_mask, EAORI_RT_EV_ANY, AORI_RT_TM_INFINITE);
if (ret) {
fprintf(stderr, "Wait Task: Failed to wait for event, code %d\n", ret);
} else {
printf("Wait Task: Event received, mask: 0x%x\n", received_mask);
}
}
int main(int argc, char *argv[]) {
AORI_RT_TASK signal_task_desc, wait_task_desc;
int ret;
// 创建事件标志组
ret = aori_event_create(&event_desc, "MyEvent", 0, EAORI_RT_EV_PRIO);
if (ret) {
fprintf(stderr, "Failed to create event flag group, code %d\n", ret);
return EXIT_FAILURE;
}
// 创建等待任务
ret = aori_task_create(&wait_task_desc, "WaitTask", TASK_STKSZ, TASK_PRIO, TASK_MODE);
if (ret) {
fprintf(stderr, "Failed to create wait task, code %d\n", ret);
return EXIT_FAILURE;
}
// 创建信号任务
ret = aori_task_create(&signal_task_desc, "SignalTask", TASK_STKSZ, TASK_PRIO, TASK_MODE);
if (ret) {
fprintf(stderr, "Failed to create signal task, code %d\n", ret);
return EXIT_FAILURE;
}
// 启动任务
aori_task_start(&wait_task_desc, &wait_task, NULL);
aori_task_start(&signal_task_desc, &signal_task, NULL);
// 等待任务结束并清理
aori_task_join(&wait_task_desc);
aori_task_join(&signal_task_desc);
aori_event_delete(&event_desc);
return EXIT_SUCCESS;
}
{{% /details %}}
int aori_event_delete (AORI_RT_EVENT *event);
删除一个事件标志组。
此例程删除由 aori_event_create() 调用先前创建的事件标志组。
参数
返回值
成功时返回零。否则:
标签
mode-unrestricted, switch-secondary
{{% details title="示例代码" closed="true" %}}
#include <aori/rt/event.h>
#include <aori/rt/task.h>
#include <stdio.h>
#include <stdlib.h>
#define TASK_PRIO 20
#define TASK_MODE AORI_RT_TASK_MODE_JOINABLE
#define TASK_STKSZ 0
#define EVENT_FLAG 0x99 // 定义使用的事件标志
AORI_RT_EVENT event_desc;
void signal_task(void *arg) {
int ret;
printf("Signal Task: Sleeping for 1 seconds before sending signal\n");
aori_task_sleep(1000000000); // 休眠1秒
printf("Signal Task: Sending signal\n");
ret = aori_event_signal(&event_desc, EVENT_FLAG);
if (ret) {
fprintf(stderr, "Signal Task: Failed to signal event, code %d\n", ret);
} else {
printf("Signal Task: Event signaled successfully\n");
}
}
void wait_task(void *arg) {
int ret;
unsigned int received_mask;
printf("Wait Task: Waiting for event\n");
ret = aori_event_wait(&event_desc, EVENT_FLAG, &received_mask, EAORI_RT_EV_ANY, AORI_RT_TM_INFINITE);
if (ret) {
fprintf(stderr, "Wait Task: Failed to wait for event, code %d\n", ret);
} else {
printf("Wait Task: Event received, mask: 0x%x\n", received_mask);
}
}
int main(int argc, char *argv[]) {
AORI_RT_TASK signal_task_desc, wait_task_desc;
int ret;
// 创建事件标志组
ret = aori_event_create(&event_desc, "MyEvent", 0, EAORI_RT_EV_PRIO);
if (ret) {
fprintf(stderr, "Failed to create event flag group, code %d\n", ret);
return EXIT_FAILURE;
}
// 创建等待任务
ret = aori_task_create(&wait_task_desc, "WaitTask", TASK_STKSZ, TASK_PRIO, TASK_MODE);
if (ret) {
fprintf(stderr, "Failed to create wait task, code %d\n", ret);
return EXIT_FAILURE;
}
// 创建信号任务
ret = aori_task_create(&signal_task_desc, "SignalTask", TASK_STKSZ, TASK_PRIO, TASK_MODE);
if (ret) {
fprintf(stderr, "Failed to create signal task, code %d\n", ret);
return EXIT_FAILURE;
}
// 启动任务
aori_task_start(&wait_task_desc, &wait_task, NULL);
aori_task_start(&signal_task_desc, &signal_task, NULL);
// 等待任务结束并清理
aori_task_join(&wait_task_desc);
aori_task_join(&signal_task_desc);
aori_event_delete(&event_desc);
return EXIT_SUCCESS;
}
{{% /details %}}
int aori_event_inquire (AORI_RT_EVENT *event, RT_EVENT_INFO *info);
查询事件标志组状态。
此例程返回关于事件的状态信息。
参数
返回值
成功时返回零,并将状态信息写入由 info 指向的结构。否则:
标签
mode-unrestricted, switch-secondary
{{% details title="示例代码" closed="true" %}}
#include <aori/rt/event.h>
#include <aori/rt/task.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define TASK_PRIO 20
#define TASK_MODE AORI_RT_TASK_MODE_JOINABLE
#define TASK_STKSZ 0
#define EVENT_FLAG 0x99 // 定义使用的事件标志
AORI_RT_EVENT event_desc;
void signal_task(void *arg) {
int ret;
AORI_RT_EVENT event_signal;
AORI_RT_EVENT_INFO info_signal;
printf("Signal Task: Sleeping for 1 seconds before sending signal\n");
aori_task_sleep(1000000000); // 休眠1秒
ret = aori_event_bind(&event_signal, "MyEvent", AORI_RT_TM_INFINITE);
if (ret) {
fprintf(stderr, "Failed to bind event: %s\n", strerror(-ret));
return;
}
ret = aori_event_inquire(&event_signal, &info_signal);
if (ret) {
fprintf(stderr, "Failed to get event info: %s\n", strerror(-ret));
return;
}
printf("Event Info:\n");
printf(" Name %s\n", info_signal.value, info_signal.nwaiters, info_signal.name);
printf("Signal Task: Sending signal\n");
ret = aori_event_signal(&event_desc, EVENT_FLAG);
if (ret) {
fprintf(stderr, "Signal Task: Failed to signal event, code %d\n", ret);
} else {
printf("Signal Task: Event signaled successfully\n");
}
aori_event_unbind(&event_signal);
}
void wait_task(void *arg) {
int ret;
unsigned int received_mask;
printf("Wait Task: Waiting for event\n");
ret = aori_event_wait(&event_desc, EVENT_FLAG, &received_mask, EAORI_RT_EV_ANY, AORI_RT_TM_INFINITE);
if (ret) {
fprintf(stderr, "Wait Task: Failed to wait for event, code %d\n", ret);
} else {
printf("Wait Task: Event received, mask: 0x%x\n", received_mask);
}
}
int main(int argc, char *argv[]) {
AORI_RT_TASK signal_task_desc, wait_task_desc;
int ret;
// 创建事件标志组
ret = aori_event_create(&event_desc, "MyEvent", 0, EAORI_RT_EV_PRIO);
if (ret) {
fprintf(stderr, "Failed to create event flag group, code %d\n", ret);
return EXIT_FAILURE;
}
// 创建等待任务
ret = aori_task_create(&wait_task_desc, "WaitTask", TASK_STKSZ, TASK_PRIO, TASK_MODE);
if (ret) {
fprintf(stderr, "Failed to create wait task, code %d\n", ret);
return EXIT_FAILURE;
}
// 创建信号任务
ret = aori_task_create(&signal_task_desc, "SignalTask", TASK_STKSZ, TASK_PRIO, TASK_MODE);
if (ret) {
fprintf(stderr, "Failed to create signal task, code %d\n", ret);
return EXIT_FAILURE;
}
// 启动任务
aori_task_start(&wait_task_desc, &wait_task, NULL);
aori_task_start(&signal_task_desc, &signal_task, NULL);
// 等待任务结束并清理
aori_task_join(&wait_task_desc);
aori_task_join(&signal_task_desc);
aori_event_delete(&event_desc);
return EXIT_SUCCESS;
}
{{% /details %}}
int aori_event_signal (AORI_RT_EVENT *event, unsigned int mask);
发出一个事件信号。
向事件标志组发布一组标志。所有因此操作而满足其等待请求的任务都会立即准备就绪。
参数
返回值
成功时返回零。否则:
标签
unrestricted, switch-primary
{{% details title="示例代码" closed="true" %}}
#include <aori/rt/event.h>
#include <aori/rt/task.h>
#include <stdio.h>
#include <stdlib.h>
#define TASK_PRIO 20
#define TASK_MODE AORI_RT_TASK_MODE_JOINABLE
#define TASK_STKSZ 0
#define EVENT_FLAG 0x99 // 定义使用的事件标志
AORI_RT_EVENT event_desc;
void signal_task(void *arg) {
int ret;
printf("Signal Task: Sleeping for 1 seconds before sending signal\n");
aori_task_sleep(1000000000); // 休眠1秒
printf("Signal Task: Sending signal\n");
ret = aori_event_signal(&event_desc, EVENT_FLAG);
if (ret) {
fprintf(stderr, "Signal Task: Failed to signal event, code %d\n", ret);
} else {
printf("Signal Task: Event signaled successfully\n");
}
}
void wait_task(void *arg) {
int ret;
unsigned int received_mask;
printf("Wait Task: Waiting for event\n");
ret = aori_event_wait(&event_desc, EVENT_FLAG, &received_mask, EAORI_RT_EV_ANY, AORI_RT_TM_INFINITE);
if (ret) {
fprintf(stderr, "Wait Task: Failed to wait for event, code %d\n", ret);
} else {
printf("Wait Task: Event received, mask: 0x%x\n", received_mask);
}
}
int main(int argc, char *argv[]) {
AORI_RT_TASK signal_task_desc, wait_task_desc;
int ret;
// 创建事件标志组
ret = aori_event_create(&event_desc, "MyEvent", 0, EAORI_RT_EV_PRIO);
if (ret) {
fprintf(stderr, "Failed to create event flag group, code %d\n", ret);
return EXIT_FAILURE;
}
// 创建等待任务
ret = aori_task_create(&wait_task_desc, "WaitTask", TASK_STKSZ, TASK_PRIO, TASK_MODE);
if (ret) {
fprintf(stderr, "Failed to create wait task, code %d\n", ret);
return EXIT_FAILURE;
}
// 创建信号任务
ret = aori_task_create(&signal_task_desc, "SignalTask", TASK_STKSZ, TASK_PRIO, TASK_MODE);
if (ret) {
fprintf(stderr, "Failed to create signal task, code %d\n", ret);
return EXIT_FAILURE;
}
// 启动任务
aori_task_start(&wait_task_desc, &wait_task, NULL);
aori_task_start(&signal_task_desc, &signal_task, NULL);
// 等待任务结束并清理
aori_task_join(&wait_task_desc);
aori_task_join(&signal_task_desc);
aori_event_delete(&event_desc);
return EXIT_SUCCESS;
}
{{% /details %}}
int aori_event_unbind (AORI_RT_EVENT *event);
解除与事件标志组的绑定。
此例程释放先前与事件标志组的绑定。此调用返回后,描述符不再适用于引用此对象。
参数
标签
thread-unrestricted
{{% details title="示例代码" closed="true" %}}
#include <aori/rt/event.h>
#include <aori/rt/task.h>
#include <stdio.h>
#include <stdlib.h>
#define TASK_PRIO 20
#define TASK_MODE AORI_RT_TASK_MODE_JOINABLE
#define TASK_STKSZ 0
#define EVENT_FLAG 0x99 // 定义使用的事件标志
AORI_RT_EVENT event_desc;
void signal_task(void *arg) {
int ret;
AORI_RT_EVENT event_signal;
printf("Signal Task: Sleeping for 1 seconds before sending signal\n");
aori_task_sleep(1000000000); // 休眠1秒
ret = aori_event_bind(&event_signal, "MyEvent", AORI_RT_TM_INFINITE);
if (ret) {
fprintf(stderr, "Failed to bind event: %s\n", strerror(-ret));
return;
}
printf("Signal Task: Sending signal\n");
ret = aori_event_signal(&event_desc, EVENT_FLAG);
if (ret) {
fprintf(stderr, "Signal Task: Failed to signal event, code %d\n", ret);
} else {
printf("Signal Task: Event signaled successfully\n");
}
aori_event_unbind(&event_signal);
}
void wait_task(void *arg) {
int ret;
unsigned int received_mask;
printf("Wait Task: Waiting for event\n");
ret = aori_event_wait(&event_desc, EVENT_FLAG, &received_mask, EAORI_RT_EV_ANY, AORI_RT_TM_INFINITE);
if (ret) {
fprintf(stderr, "Wait Task: Failed to wait for event, code %d\n", ret);
} else {
printf("Wait Task: Event received, mask: 0x%x\n", received_mask);
}
}
int main(int argc, char *argv[]) {
AORI_RT_TASK signal_task_desc, wait_task_desc;
int ret;
// 创建事件标志组
ret = aori_event_create(&event_desc, "MyEvent", 0, EAORI_RT_EV_PRIO);
if (ret) {
fprintf(stderr, "Failed to create event flag group, code %d\n", ret);
return EXIT_FAILURE;
}
// 创建等待任务
ret = aori_task_create(&wait_task_desc, "WaitTask", TASK_STKSZ, TASK_PRIO, TASK_MODE);
if (ret) {
fprintf(stderr, "Failed to create wait task, code %d\n", ret);
return EXIT_FAILURE;
}
// 创建信号任务
ret = aori_task_create(&signal_task_desc, "SignalTask", TASK_STKSZ, TASK_PRIO, TASK_MODE);
if (ret) {
fprintf(stderr, "Failed to create signal task, code %d\n", ret);
return EXIT_FAILURE;
}
// 启动任务
aori_task_start(&wait_task_desc, &wait_task, NULL);
aori_task_start(&signal_task_desc, &signal_task, NULL);
// 等待任务结束并清理
aori_task_join(&wait_task_desc);
aori_task_join(&signal_task_desc);
aori_event_delete(&event_desc);
return EXIT_SUCCESS;
}
{{% /details %}}
int aori_event_wait(AORI_RT_EVENT *event, unsigned int mask, unsigned int *mask_r, AORI_RT_EVENT_OPERATION_MODE mode,
AORI_RT_TIME timeout);
等待任意集合的事件(具有相对标量超时)。
此例程是 aori_event_wait_timed() 的一个变体,接受以标量值表示的相对超时规范。
参数
标签
xthread-nowait, switch-primary
{{% details title="示例代码" closed="true" %}}
#include <aori/rt/event.h>
#include <aori/rt/task.h>
#include <stdio.h>
#include <stdlib.h>
#define TASK_PRIO 20
#define TASK_MODE AORI_RT_TASK_MODE_JOINABLE
#define TASK_STKSZ 0
#define EVENT_FLAG 0x99 // 定义使用的事件标志
AORI_RT_EVENT event_desc;
void signal_task(void *arg) {
int ret;
printf("Signal Task: Sleeping for 1 seconds before sending signal\n");
aori_task_sleep(1000000000); // 休眠1秒
printf("Signal Task: Sending signal\n");
ret = aori_event_signal(&event_desc, EVENT_FLAG);
if (ret) {
fprintf(stderr, "Signal Task: Failed to signal event, code %d\n", ret);
} else {
printf("Signal Task: Event signaled successfully\n");
}
}
void wait_task(void *arg) {
int ret;
unsigned int received_mask;
printf("Wait Task: Waiting for event\n");
ret = aori_event_wait(&event_desc, EVENT_FLAG, &received_mask, EAORI_RT_EV_ALL, AORI_RT_TM_INFINITE);
if (ret) {
fprintf(stderr, "Wait Task: Failed to wait for event, code %d\n", ret);
} else {
printf("Wait Task: Event received, mask: 0x%x\n", received_mask);
}
}
int main(int argc, char *argv[]) {
AORI_RT_TASK signal_task_desc, wait_task_desc;
int ret;
// 创建事件标志组
ret = aori_event_create(&event_desc, "MyEvent", 0, EAORI_RT_EV_PRIO);
if (ret) {
fprintf(stderr, "Failed to create event flag group, code %d\n", ret);
return EXIT_FAILURE;
}
// 创建等待任务
ret = aori_task_create(&wait_task_desc, "WaitTask", TASK_STKSZ, TASK_PRIO, TASK_MODE);
if (ret) {
fprintf(stderr, "Failed to create wait task, code %d\n", ret);
return EXIT_FAILURE;
}
// 创建信号任务
ret = aori_task_create(&signal_task_desc, "SignalTask", TASK_STKSZ, TASK_PRIO, TASK_MODE);
if (ret) {
fprintf(stderr, "Failed to create signal task, code %d\n", ret);
return EXIT_FAILURE;
}
// 启动任务
aori_task_start(&wait_task_desc, &wait_task, NULL);
aori_task_start(&signal_task_desc, &signal_task, NULL);
// 等待任务结束并清理
aori_task_join(&wait_task_desc);
aori_task_join(&signal_task_desc);
aori_event_delete(&event_desc);
return EXIT_SUCCESS;
}
{{% /details %}}
int aori_event_wait_timed (AORI_RT_EVENT *event, unsigned int mask, unsigned int *mask_r, AORI_RT_EVENT_OPERATION_MODE mode, const struct timespec *abs_timeout);
等待任意集合的事件。
等待在事件中发出一个或多个事件,或者直到超时。
参数
返回值
成功时返回零。否则:
标签
xthread-nowait, switch-primary
{{% details title="示例代码" closed="true" %}}
#include <aori/rt/event.h>
#include <aori/rt/task.h>
#include <aori/nrt/clock.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#define TASK_PRIO 20
#define TASK_MODE AORI_RT_TASK_MODE_JOINABLE
#define TASK_STKSZ 0
#define EVENT_FLAG 0x99 // 定义使用的事件标志
AORI_RT_EVENT event_desc;
void signal_task(void *arg) {
int ret;
printf("Signal Task: Sleeping for 3 seconds before sending signal\n");
aori_task_sleep(3000000000); // 休眠 3 秒
printf("Signal Task: Sending signal\n");
ret = aori_event_signal(&event_desc, EVENT_FLAG);
if (ret) {
fprintf(stderr, "Signal Task: Failed to signal event, code %d\n", ret);
} else {
printf("Signal Task: Event signaled successfully\n");
}
}
void wait_task(void *arg) {
int ret;
unsigned int received_mask = 0;
while (!received_mask) {
printf("Wait Task: Waiting for event\n");
struct timespec ts;
aori_nrt_clock_gettime(CLOCK_MONOTONIC, &ts);
ts.tv_sec += 2; // 超时时间2秒
ret = aori_event_wait_timed(&event_desc, EVENT_FLAG, &received_mask, EAORI_RT_EV_ANY, &ts);
if (ret == -ETIMEDOUT) {
printf("Wait Task: Event Timeout\n");
} else if (ret) {
fprintf(stderr, "Wait Task: Failed to wait for event, code %d\n", ret);
} else {
printf("Wait Task: Event received, mask: 0x%x\n", received_mask);
}
}
}
int main(int argc, char *argv[]) {
AORI_RT_TASK signal_task_desc, wait_task_desc;
int ret;
// 创建事件标志组
ret = aori_event_create(&event_desc, "MyEvent", 0, EAORI_RT_EV_PRIO);
if (ret) {
fprintf(stderr, "Failed to create event flag group, code %d\n", ret);
return EXIT_FAILURE;
}
// 创建等待任务
ret = aori_task_create(&wait_task_desc, "WaitTask", TASK_STKSZ, TASK_PRIO, TASK_MODE);
if (ret) {
fprintf(stderr, "Failed to create wait task, code %d\n", ret);
return EXIT_FAILURE;
}
// 创建信号任务
ret = aori_task_create(&signal_task_desc, "SignalTask", TASK_STKSZ, TASK_PRIO, TASK_MODE);
if (ret) {
fprintf(stderr, "Failed to create signal task, code %d\n", ret);
return EXIT_FAILURE;
}
// 启动任务
aori_task_start(&wait_task_desc, &wait_task, NULL);
aori_task_start(&signal_task_desc, &signal_task, NULL);
// 等待任务结束并清理
aori_task_join(&wait_task_desc);
aori_task_join(&signal_task_desc);
aori_event_delete(&event_desc);
return EXIT_SUCCESS;
}
{{% /details %}}
int aori_event_wait_until (AORI_RT_EVENT *event, unsigned int mask, unsigned int *mask_r, AORI_RT_EVENT_OPERATION_MODE mode, RTIME timeout);
等待任意一组事件(带绝对标量超时)。
此例程是 aori_event_wait_timed() 的变体,接受以标量值表示的绝对超时规范。
参数
标签
xthread-nowait, switch-primary
{{% details title="示例代码" closed="true" %}}
#include <aori/nrt/clock.h>
#include <aori/rt/event.h>
#include <aori/rt/task.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#define TASK_PRIO 20
#define TASK_MODE AORI_RT_TASK_MODE_JOINABLE
#define TASK_STKSZ 0
#define EVENT_FLAG 0x99 // 定义使用的事件标志
AORI_RT_EVENT event_desc;
void signal_task(void *arg) {
int ret;
printf("Signal Task: Sleeping for 3 seconds before sending signal\n");
aori_task_sleep(3000000000); // 休眠 3 秒
printf("Signal Task: Sending signal\n");
ret = aori_event_signal(&event_desc, EVENT_FLAG);
if (ret) {
fprintf(stderr, "Signal Task: Failed to signal event, code %d\n", ret);
} else {
printf("Signal Task: Event signaled successfully\n");
}
}
void wait_task(void *arg) {
int ret;
unsigned int received_mask = 0;
while (!received_mask) {
printf("Wait Task: Waiting for event\n");
AORI_RT_TIME timeout = aori_timer_read() + 2000000000; // 超时时间2秒
ret = aori_event_wait_until(&event_desc, EVENT_FLAG, &received_mask, EAORI_RT_EV_ANY, timeout);
if (ret == -ETIMEDOUT) {
printf("Wait Task: Event Timeout\n");
} else if (ret) {
fprintf(stderr, "Wait Task: Failed to wait for event, code %d\n", ret);
} else {
printf("Wait Task: Event received, mask: 0x%x\n", received_mask);
}
}
}
int main(int argc, char *argv[]) {
AORI_RT_TASK signal_task_desc, wait_task_desc;
int ret;
// 创建事件标志组
ret = aori_event_create(&event_desc, "MyEvent", 0, EAORI_RT_EV_PRIO);
if (ret) {
fprintf(stderr, "Failed to create event flag group, code %d\n", ret);
return EXIT_FAILURE;
}
// 创建等待任务
ret = aori_task_create(&wait_task_desc, "WaitTask", TASK_STKSZ, TASK_PRIO, TASK_MODE);
if (ret) {
fprintf(stderr, "Failed to create wait task, code %d\n", ret);
return EXIT_FAILURE;
}
// 创建信号任务
ret = aori_task_create(&signal_task_desc, "SignalTask", TASK_STKSZ, TASK_PRIO, TASK_MODE);
if (ret) {
fprintf(stderr, "Failed to create signal task, code %d\n", ret);
return EXIT_FAILURE;
}
// 启动任务
aori_task_start(&wait_task_desc, &wait_task, NULL);
aori_task_start(&signal_task_desc, &signal_task, NULL);
// 等待任务结束并清理
aori_task_join(&wait_task_desc);
aori_task_join(&signal_task_desc);
aori_event_delete(&event_desc);
return EXIT_SUCCESS;
}
{{% /details %}}