Files
mr-library/document/device/timer/timer.md
2024-02-02 16:38:44 +08:00

5.6 KiB
Raw Blame History

TIMER设备

English

打开TIMER设备

int mr_dev_open(const char *path, int flags);
参数 描述
path 设备路径
flags 打开设备的标志
返回值
>=0 设备描述符
<0 错误码
  • pathTIMER设备路径一般为timerx,例如:timer1timer2timer3
  • flags:打开设备的标志,支持 MR_O_RDONLYMR_O_WRONLYMR_O_RDWR

使用时应根据实际情况为不同的任务分别打开TIMER设备并使用适当的flags进行管理和权限控制,以确保它们不会相互影响。

关闭TIMER设备

int mr_dev_close(int desc);
参数 描述
desc 设备描述符
返回值
=0 关闭成功
<0 错误码

控制TIMER设备

int mr_dev_ioctl(int desc, int cmd, void *args);
参数 描述
desc 设备描述符
cmd 命令码
args 命令参数
返回值
=0 设置成功
<0 错误码
  • cmd:命令码,支持以下命令:
    • MR_IOC_TIMER_SET_MODE设置TIMER设备模式。
    • MR_IOC_TIMER_SET_TIMEOUT_CALL:设置超时回调函数。
    • MR_IOC_TIMER_GET_MODE获取TIMER设备模式。
    • MR_IOC_TIMER_GET_TIMEOUT_CALL:获取超时回调函数。

设置/获取TIMER设备配置

TIMER设备配置

  • mode:周期或单次模式。
/* 定义TIMER设备模式 */
#define TIMER_MODE                      MR_TIMER_MODE_ONESHOT

/* 设置TIMER设备模式 */
mr_dev_ioctl(ds, MR_IOC_TIMER_SET_MODE, MR_MAKE_LOCAL(int, TIMER_MODE));

/* 获取TIMER设备模式 */
int mode;
mr_dev_ioctl(ds, MR_IOC_TIMER_GET_MODE, &mode);

不依赖TIMER接口

/* 定义TIMER设备模式 */
#define TIMER_MODE                      1

/* 设置TIMER设备模式 */
mr_dev_ioctl(ds, MR_IOC_SCFG, MR_MAKE_LOCAL(int, TIMER_MODE));

/* 获取TIMER设备模式 */
int mode;
mr_dev_ioctl(ds, MR_IOC_GCFG, &mode);

注:如未手动配置,默认配置为:

  • 模式:MR_TIMER_MODE_PERIOD

设置/获取超时回调函数

/* 定义回调函数 */
void fn(int desc, void *args)
{
    /* 处理中断 */
}
void (*callback)(int desc, void *args);
    
/* 设置超时回调函数 */
mr_dev_ioctl(ds, MR_IOC_TIMER_SET_TIMEOUT_CALL, &fn);
/* 获取超时回调函数 */
mr_dev_ioctl(ds, MR_IOC_TIMER_GET_TIMEOUT_CALL, &callback);

不依赖TIMER接口

/* 定义回调函数 */
void fn(int desc, void *args)
{
    /* 处理中断 */
}
void (*callback)(int desc, void *args);
    
/* 设置超时回调函数 */
mr_dev_ioctl(ds, MR_IOC_SRCB, &fn);
/* 获取超时回调函数 */
mr_dev_ioctl(ds, MR_IOC_GRCB, &callback);

读取TIMER设备运行时间

ssize_t mr_dev_read(int desc, void *buf, size_t count);
参数 描述
desc 设备描述符
buf 读取数据缓冲区
count 读取数据大小
返回值
>=0 读取数据大小
<0 错误码
uint32_t time;
/* 读取TIMER设备数据 */
ssize_t size = mr_dev_read(ds, &time, sizeof(time));
/* 是否读取成功 */
if (size < 0)
{
    
}

注:

  • 时间单位为微妙。单次读取最小单位为uint32_t即4个字节。
  • 运行时间指定时器启动后运行的时间,超时后重置。

写入TIMER设备定时时间

ssize_t mr_dev_write(int desc, const void *buf, size_t count);
参数 描述
desc 设备描述符
buf 写入数据缓冲区
count 写入数据大小
返回值
>=0 写入数据大小
<0 错误码

注:

  • 时间单位为微妙。单次写入最小单位为uint32_t即4个字节。
  • 当有一次写入多个单位数据时,仅实际生效最后一个有效数据(如果最后一个有效数据为0将关闭定时器)。

使用示例

#include "include/mr_lib.h"

void timeout_call(int desc, void *args)
{
    mr_printf("Timeout\r\n");
}

/* 定时时间 */
#define TIMEOUT                         500000

void timer_init(void)
{
    /* 初始化TIMER */
    int timer_ds = mr_dev_open("timer1", MR_O_RDWR);
    if (timer_ds < 0)
    {
        mr_printf("timer open failed: %s\r\n", mr_strerror(timer_ds));
        return;
    }
    /* 打印TIMER描述符 */
    mr_printf("TIMER desc: %d\r\n", timer_ds);
    /* 设置超时回调函数 */
    mr_dev_ioctl(timer_ds, MR_IOC_TIMER_SET_TIMEOUT_CALL, timeout_call);
    /* 设置定时时间 */
    uint32_t timeout = TIMEOUT;
    int ret = mr_dev_write(timer_ds, &timeout, sizeof(timeout));
    if(ret < 0)
    {
        mr_printf("timer write failed: %s\r\n", mr_strerror(ret));
    }
}
/* 导出到自动初始化APP级 */
MR_INIT_APP_EXPORT(timer_init);

int main(void)
{
    /* 自动初始化timer_init函数将在此处自动调用 */
    mr_auto_init();

    while(1)
    {
        
    }
}

定时器以500ms为周期每500ms打印一次Timeout