通用看门狗定时器。
通用看门狗定时器。
警报是通用的看门狗定时器。Alchemy任务可以创建任意数量的警报,并在指定的初始延迟过去后使用它们运行用户定义的处理程序。警报可以是一次性的或周期性的;在后一种情况下,实时系统会根据用户定义的间隔值自动为下一次触发重新编程警报。
int aori_alarm_create(AORI_RT_ALARM *alarm, const char *name, void (*handler)(void *arg), void *arg) WARNING_SWITCH;
创建一个警报对象。
此例程创建一个在未来指定时间触发警报例程的对象。警报可以是周期性的或一次性的,这取决于传递给 aori_alarm_create() 的重载间隔值。
参数
返回值
成功时返回零。否则:
标签
mode-unrestricted, switch-secondary
注意
警报是进程私有对象,因此不能由多个进程共享,即使它们属于同一 rkernel 会话。
{{% details title="示例代码" closed="true" %}}
#include <aori/rt/alarm.h>
#include <aori/rt/task.h>
#include <stdio.h>
#include <stdlib.h>
#define ALARM_PERIOD 1000000000LL // 1秒,以纳秒为单位
static AORI_RT_ALARM alarm_desc;
void alarm_handler(void *arg) { printf("Alarm Trigger! Current Time: %lld ns\n", aori_timer_read()); }
int main(int argc, char *argv[]) {
int ret;
ret = aori_alarm_create(&alarm_desc, "my_alarm", alarm_handler, NULL);
if (ret) {
perror("aori_alarm_start");
return EXIT_FAILURE;
}
printf("Alarm Start...\n");
ret = aori_alarm_start(&alarm_desc, ALARM_PERIOD, ALARM_PERIOD);
if (ret) {
perror("aori_alarm_start");
aori_alarm_delete(&alarm_desc);
return EXIT_FAILURE;
}
// 让主线程休眠,以便警报可以触发几次
aori_task_sleep(ALARM_PERIOD * 5);
printf("Stop and delete alarm...\n");
aori_alarm_stop(&alarm_desc);
aori_alarm_delete(&alarm_desc);
return EXIT_SUCCESS;
}
{{% /details %}}
int aori_alarm_delete(AORI_RT_ALARM *alarm) WARNING_SWITCH;
删除一个警报。
此例程删除由 aori_alarm_delete() 创建的警报对象。
参数
返回值
成功时返回零。否则:
标签
mode-unrestricted, switch-secondary
{{% details title="示例代码" closed="true" %}}
#include <aori/rt/alarm.h>
#include <aori/rt/task.h>
#include <stdio.h>
#include <stdlib.h>
#define ALARM_PERIOD 1000000000LL // 1秒,以纳秒为单位
static AORI_RT_ALARM alarm_desc;
void alarm_handler(void *arg) { printf("Alarm Trigger! Current Time: %lld ns\n", aori_timer_read()); }
int main(int argc, char *argv[]) {
int ret;
ret = aori_alarm_create(&alarm_desc, "my_alarm", alarm_handler, NULL);
if (ret) {
perror("aori_alarm_start");
return EXIT_FAILURE;
}
printf("Alarm Start...\n");
ret = aori_alarm_start(&alarm_desc, ALARM_PERIOD, ALARM_PERIOD);
if (ret) {
perror("aori_alarm_start");
aori_alarm_delete(&alarm_desc);
return EXIT_FAILURE;
}
// 让主线程休眠,以便警报可以触发几次
aori_task_sleep(ALARM_PERIOD * 5);
printf("Stop and delete alarm...\n");
aori_alarm_stop(&alarm_desc);
aori_alarm_delete(&alarm_desc);
return EXIT_SUCCESS;
}
{{% /details %}}
int aori_alarm_inquire(AORI_RT_ALARM *alarm, AORI_RT_ALARM_INFO *info);
查询警报状态。
此例程返回有关指定“警报”的状态信息。
参数
返回值
成功后返回零并将状态信息写入 info 指向的结构。否则:
标签
unrestricted, switch-primary
{{% details title="示例代码" closed="true" %}}
#include <aori/rt/alarm.h>
#include <aori/rt/task.h>
#include <stdio.h>
#include <stdlib.h>
#define ALARM_PERIOD 1000000000LL // 1秒,以纳秒为单位
static AORI_RT_ALARM alarm_desc;
static AORI_RT_ALARM_INFO alarm_info;
void alarm_handler(void *arg) {
if (aori_alarm_inquire(&alarm_desc, &alarm_info) != 0) {
perror("aori_alarm_inquire");
exit(1);
}
printf("%s [%s]: expired %ld\n", alarm_info.name, alarm_info.active > 0 ? "active" : "passive", alarm_info.expiries);
}
int main(int argc, char *argv[]) {
int ret;
ret = aori_alarm_create(&alarm_desc, "my_alarm", alarm_handler, NULL);
if (ret) {
perror("aori_alarm_start");
return EXIT_FAILURE;
}
printf("Alarm Start...\n");
ret = aori_alarm_start(&alarm_desc, ALARM_PERIOD, ALARM_PERIOD);
if (ret) {
perror("aori_alarm_start");
aori_alarm_delete(&alarm_desc);
return EXIT_FAILURE;
}
// 让主线程休眠,以便警报可以触发几次
aori_task_sleep(ALARM_PERIOD * 5);
printf("Stop and delete alarm...\n");
aori_alarm_stop(&alarm_desc);
if (aori_alarm_inquire(&alarm_desc, &alarm_info) != 0) {
perror("aori_alarm_inquire");
return EXIT_FAILURE;
}
printf("%s [%s]: expired %ld\n", alarm_info.name, alarm_info.active > 0 ? "active" : "passive", alarm_info.expiries);
aori_alarm_delete(&alarm_desc);
return EXIT_SUCCESS;
}
{{% /details %}}
int aori_alarm_start(AORI_RT_ALARM *alarm, AORI_RT_TIME value, AORI_RT_TIME interval);
启动一个警报。
此例程设置警报对象的触发日期。警报可以是周期性的或一次性的,这取决于间隔值。
警报处理程序总是由Xenomai的内部定时器事件例程代理调用。因此,可以从这些处理程序中调用的Xenomai例程被限制为可以代表异步上下文提供的服务集。
此服务覆盖了警报的到期日期和重新加载间隔的任何先前设置。
参数
返回值
成功时返回零。否则:
标签
xthread-only, switch-primary
注意
初始值和间隔的每一个都被解释为Alchemy时钟分辨率的倍数(参见 alchemy-clock-resolution 选项,默认为1纳秒)。
{{% details title="示例代码" closed="true" %}}
#include <aori/rt/alarm.h>
#include <aori/rt/task.h>
#include <stdio.h>
#include <stdlib.h>
#define ALARM_PERIOD 1000000000LL // 1秒,以纳秒为单位
static AORI_RT_ALARM alarm_desc;
void alarm_handler(void *arg) { printf("Alarm Trigger! Current Time: %lld ns\n", aori_timer_read()); }
int main(int argc, char *argv[]) {
int ret;
ret = aori_alarm_create(&alarm_desc, "my_alarm", alarm_handler, NULL);
if (ret) {
perror("aori_alarm_start");
return EXIT_FAILURE;
}
printf("Alarm Start...\n");
ret = aori_alarm_start(&alarm_desc, ALARM_PERIOD, ALARM_PERIOD);
if (ret) {
perror("aori_alarm_start");
aori_alarm_delete(&alarm_desc);
return EXIT_FAILURE;
}
// 让主线程休眠,以便警报可以触发几次
aori_task_sleep(ALARM_PERIOD * 5);
printf("Stop and delete alarm...\n");
aori_alarm_stop(&alarm_desc);
aori_alarm_delete(&alarm_desc);
return EXIT_SUCCESS;
}
{{% /details %}}
int aori_alarm_stop(AORI_RT_ALARM *alarm);
停止一个警报。
此例程禁用警报对象,防止任何进一步到期,直到通过 aori_alarm_start() 重新启用它。
参数
返回值
成功时返回零。否则:
标签
unrestricted, switch-primary
{{% details title="示例代码" closed="true" %}}
#include <aori/rt/alarm.h>
#include <aori/rt/task.h>
#include <stdio.h>
#include <stdlib.h>
#define ALARM_PERIOD 1000000000LL // 1秒,以纳秒为单位
static AORI_RT_ALARM alarm_desc;
void alarm_handler(void *arg) { printf("Alarm Trigger! Current Time: %lld ns\n", aori_timer_read()); }
int main(int argc, char *argv[]) {
int ret;
ret = aori_alarm_create(&alarm_desc, "my_alarm", alarm_handler, NULL);
if (ret) {
perror("aori_alarm_start");
return EXIT_FAILURE;
}
printf("Alarm Start...\n");
ret = aori_alarm_start(&alarm_desc, ALARM_PERIOD, ALARM_PERIOD);
if (ret) {
perror("aori_alarm_start");
aori_alarm_delete(&alarm_desc);
return EXIT_FAILURE;
}
// 让主线程休眠,以便警报可以触发几次
aori_task_sleep(ALARM_PERIOD * 5);
printf("Stop and delete alarm...\n");
aori_alarm_stop(&alarm_desc);
aori_alarm_delete(&alarm_desc);
return EXIT_SUCCESS;
}
{{% /details %}}