通用看门狗定时器。
通用看门狗定时器。
警报是通用的看门狗定时器。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;
}