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