定时器管理
硬件定时器:由外部晶振提供给芯片输入时钟
软件定时器:由操作系统提供,以时钟节拍的时间长度为单位,定时数值必须是时钟节拍的整数倍。系统的时钟节拍为10ms,软定时器的时间设置必须为20ms,30ms等。
两种定时器机制:
单次触发定时器:只执行一次定时器事件,之后定时器自动停止
周期触发定时器:周期性触发定时器事件,直道用户手工停止
HAED_TIMER模式(默认模式)
该模式下的定时器超时函数在中断上下文环境中执行,可以在初始化 / 创建定时器时使用参数 RT_TIMER_FLAG_HARD_TIMER 来指定。
SOFT_TIMER模式
通过宏定义 RT_USING_TIMER_SOFT 来决定是否启用该模式。该模式被启用后,系统会在初始化时创建一个 timer 线程,然后 SOFT_TIMER 模式的定时器超时函数在都会在 timer 线程的上下文环境中执行。可以在初始化 / 创建定时器时使用参数 RT_TIMER_FLAG_SOFT_TIMER 来指定设置 SOFT_TIMER 模式。
定时器控制块:
struct rt_timer
typedef struct rt_timer *rt_timer_t
定时器管理方式:
初始化定时器:
void rt_system_timer_init(void);
SOFT_TIMER初始化:
void rt_system_timer_thread_init(void);
定时器的创建:
rt_timer_t rt_timer_create()
定时器的删除(释放内存)
rt_err_t rt_timer_delete(rt_timer_t timer);
定时器的初始化:
rt_timer_init()
定时器的脱离:(不释放内存)
rt_err_t rt_timer_detach(rt_timer_t timer);
启动定时器:
rt_err_t rt_timer_start(rt_timer_t timer);
停止定时器:
rt_err_t rt_timer_stop(rt_timer_t timer);
控制定时器函数接口:
可以根据命令类型的参数来查看修改定时器的设置
rt_err_t rt_timer_control(rt_timer_t timer, rt_uint8_t cmd, void* arg);
参数:timer,定时器句柄
cmd 用于控制定时器的命令,当前支持四个命令,分别是设置定时时间,查看定时时间,设置单次触发,设置周期触发
arg 与 cmd 相对应的控制命令参数 比如,cmd 为设定超时时间时,就可以将超时时间参数通过 arg 进行设定
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 / 设置定时器为周期型定时器 */
高精度延时
使用定时器延时因为每次的延时时间都是时钟节拍的整数倍,如果需要更加精确的延时,就需要使用读取硬件定时器的计数或直接使用硬件定时器
在 Cortex-M 系列中,SysTick 已经被 RT-Thread 用于作为 OS Tick 使用,它被配置成 1/RT_TICK_PER_SECOND 秒后触发一次中断的方式,中断处理函数使用 Cortex-M3 默认的 SysTick_Handler 名字。在 Cortex-M3 的 CMSIS(Cortex Microcontroller Software Interface Standard)规范中规定了 SystemCoreClock 代表芯片的主频,所以基于 SysTick 以及 SystemCoreClock,我们能够使用 SysTick 获得一个精确的延时函数,如下例所示,Cortex-M3 上的基于 SysTick 的精确延时(需要系统在使能 SysTick 后使用):