-
系统时间
rt_tick 全局变量,记录开机时间
rt_tick_t rt_tick_get(void);
-
定时器控制块
struct rt_timer
{
struct rt_object parent;
rt_list_t row[RT_TIMER_SKIP_LIST_LEVEL];
void (*timeout_func)(void *parameter);
void *parameter;
rt_tick_t init_tick;
rt_tick_t timeout_tick;
};
typedef struct rt_timer *rt_timer_t;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FNOQPpiG-1607954433686)(https://www.rt-thread.org/document/site/programming-manual/timer/figures/05timer_ops.png)]
定时器API
1. 创建删除
动态创建一个定时器
rt_timer_t rt_timer_create(const char* name,
void (*timeout)(void* parameter),
void* parameter,
rt_tick_t time,
rt_uint8_t flag);
参数 | 描述 |
---|
name | 定时器的名称 |
void (timeout) (void parameter) | 定时器超时函数指针(当定时器超时时,系统会调用这个函数) |
parameter | 定时器超时函数的入口参数(当定时器超时时,调用超时回调函数会把这个参数做为入口参数传递给超时函数) |
time | 定时器的超时时间,单位是时钟节拍 |
flag | 定时器创建时的参数,支持的值包括单次定时、周期定时、硬件定时器、软件定时器等(可以用 “或” 关系取多个值) |
返回 | —— |
RT_NULL | 创建失败(通常会由于系统内存不够用而返回 RT_NULL) |
定时器的句柄 | 定时器创建成功 |
flag:可以以 | 方式传递
#define RT_TIMER_FLAG_ONE_SHOT 0x0
#define RT_TIMER_FLAG_PERIODIC 0x2
#define RT_TIMER_FLAG_HARD_TIMER 0x0
#define RT_TIMER_FLAG_SOFT_TIMER 0x4
静态创建定时器:
void rt_timer_init(rt_timer_t timer,
const char* name,
void (*timeout)(void* parameter),
void* parameter,
rt_tick_t time, rt_uint8_t flag);
参数 | 描述 |
---|
timer | 定时器句柄,指向要初始化的定时器控制块 |
name | 定时器的名称 |
void (timeout) (void parameter) | 定时器超时函数指针(当定时器超时时,系统会调用这个函数) |
parameter | 定时器超时函数的入口参数(当定时器超时时,调用超时回调函数会把这个参数做为入口参数传递给超时函数) |
time | 定时器的超时时间,单位是时钟节拍 |
flag(同上) | 定时器创建时的参数,支持的值包括单次定时、周期定时、硬件定时器、软件定时器(可以用 “或” 关系取多个值),详见创建定时器小节 |
删除回收一个动态定时器:
rt_err_t rt_timer_delete(rt_timer_t timer);
参数 | 描述 |
---|
timer | 定时器句柄,指向要删除的定时器 |
返回 | —— |
RT_EOK | 删除成功(如果参数 timer 句柄是一个 RT_NULL,将会导致一个 ASSERT 断言) |
删除一个静态定时器
rt_err_t rt_timer_detach(rt_timer_t timer);
参数 | 描述 |
---|
timer | 定时器句柄,指向要脱离的定时器控制块 |
返回 | —— |
RT_EOK | 脱离成功 |
2. 启动和停止定时器
启动定时器
rt_err_t rt_timer_start(rt_timer_t timer);
参数 | 描述 |
---|
timer | 定时器句柄,指向要启动的定时器控制块 |
返回 | —— |
RT_EOK | 启动成功 |
停止定时器
rt_err_t rt_timer_stop(rt_timer_t timer);
参数 | 描述 |
---|
timer | 定时器句柄,指向要停止的定时器控制块 |
返回 | —— |
RT_EOK | 成功停止定时器 |
- RT_ERROR | timer 已经处于停止状态 |
3. 控制定时器
rt_err_t rt_timer_control(rt_timer_t timer, rt_uint8_t cmd, void* arg);
参数 | 描述 |
---|
timer | 定时器句柄,指向要停止的定时器控制块 |
cmd | 用于控制定时器的命令,当前支持四个命令,分别是设置定时时间,查看定时时间,设置单次触发,设置周期触发 |
arg | 与 cmd 相对应的控制命令参数 比如,cmd 为设定超时时间时,就可以将超时时间参数通过 arg 进行设定 |
返回 | —— |
RT_EOK | 成功 |
cmd:
#define RT_TIMER_CTRL_SET_TIME 0x0
#define RT_TIMER_CTRL_GET_TIME 0x1
#define RT_TIMER_CTRL_SET_ONESHOT 0x2
#define RT_TIMER_CTRL_SET_PERIODIC 0x3