嘀嗒时钟
时钟tick的频率一般由RT_TICK_PER_SECOND宏定义决定,系统默认设置RT_TICK_PER_SECOND为1000,注意RT_TICK_PER_SECOND不能大于1000,防止嘀嗒硬件溢出,无返回值
定时器
我们首先要区分操作系统定时器和芯片上的硬件定时器:
- 硬件定时器:是芯片本身提供的定时功能,一般由外部晶振提供芯片输入时钟,当到达设定的时间值后芯片中断控制器产生时钟中断;硬件定时器的精度都很高,都可以达到ns级别,并且是中断触发的方式,但是定时器数量有限
- 操作系统定时器:是由操作系统提供给的一类接口,在硬件定时器基础上,使系统能够提供不受数量限制的定时器服务
RT-thread实时操作系统提供了软件定时器接口
创建定时器
rt_timer_t rt_timer_create(const char *name,
void (*timeout)(void *parameter),
void *parameter,
rt_tick_t time,
rt_uint8_t flag);
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_SOFT1_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);
删除定时器
rt_err_t rt_timer_delete(rt_timer_t timer);
使用create创建的定时器,调用这个函数,会将定时器从rt_timer链表中删除,并释放该定时器控制块占用的内存
脱离定时器
rt_err_t rt_timer_detach(rt_timer_t timer);
使用init初始化的定时,使用该函数会将定时器从内核对象容器中脱离出,但定时器对象所占用的空间不会释放
启动/关闭定时器
rt_err_t rt_timer_start(rt_timer_t timer);
rt_err_t rt_timer_stop(rt_timer_t timer);
启动定时器后,定时器的状态,会改为激活状态RT_TIMER_FLAG_ACTIVATED,并按照超时顺序插入到rt_timer队列链表中
停止定时器后,定时器的状态会更改为停止状态RT_TIMER_FLAG_DEACTIVATED,并从rt_timer链表中脱离出来不参与定时器超时检查;周期定时器在定时器到期时,可以待用这个函数停止该定时器
#define RT_TIMER_FLAG_DEACTIVATED 0x0 /**< timer 激活状态 */
#define RT_TIMER_FLAG_ACTIVATED 0x1 /**< timer 停止状态 */
控制定时器
rt_err_t rt_timer_control(rt_timer_t timer, int cmd, void *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 /**< 周期定时 */