5.6 KiB
5.6 KiB
TIMER设备
打开TIMER设备
int mr_dev_open(const char *path, int flags);
| 参数 | 描述 |
|---|---|
| path | 设备路径 |
| flags | 打开设备的标志 |
| 返回值 | |
>=0 |
设备描述符 |
<0 |
错误码 |
path:TIMER设备路径一般为:timerx,例如:timer1、timer2、timer3。flags:打开设备的标志,支持MR_O_RDONLY、MR_O_WRONLY、MR_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。