RT-Thread入门之定时器
上一篇文章我们学习了RT-Thread建立线程相关函数,这次我们将学习系统中一个很重要的功能:定时器。系统提供的软件定时器可以为我们提供无限个定时器使用,但定时时间必须是系统节拍的整数倍。RT-Thread 中,时钟节拍的长度可以根据 RT_TICK_PER_SECOND 的定义来调整,我们使用的工程设置的为100,这里我们就使用他的默认设置,所以我们可以设置的定时时间只能为10ms的整数倍。
一、HARD/SOFT_TIMER区别
HARD_TIMER 模式的定时器超时函数在中断上下文环境中执行,在中断上下文环境中执行时,对于超时函数的要求与中断服务例程的要求相同:执行时间应该尽量短,
执行时不应导致当前上下文挂起、等待。
SOFT_TIMER 模 式 可 配 置, 通 过 宏 定 义RT_USING_TIMER_SOFT 来 决 定 是 否 启 用 该 模式,该宏定义在rtconfigs.h中定义,默认为不使用。该模式被启用后,系统会在初始化时创建一个 timer 线程,然后SOFT_TIMER 模式的定时器超时函数在都会在 timer 线程的上下文环境中执行。
总结起来就是:hard_timer中断服务程序不能被打断,soft_timer中断服务程序和线程一样参与任务的调度。
除此之外,定时器也有两种创建方式:动态方式和静态方式。额我认为大多数时间使用动态方式就可以了,他们的区别和进程类似,代码空间的分配方式不同,这篇文章主要使用动态方式进行实验。
二、相关函数介绍
1.rt_timer_create 通过这个函数可以设置定时器的定时时间,超时函数入口和定时器模式等一些参数。
rt_timer_t rt_timer_create(const char* name,
void (*timeout)(void* parameter),
void* parameter,
rt_tick_t time,
rt_uint8_t flag);
2.rt_timer_start 设置完成定时器的参数之后定时器不会立即启动,只有调用rt_timer_start函数之后定时器才开始计时。
rt_err_t rt_timer_start(rt_timer_t timer);
3.rt_timer_stop 启动定时器以后,若想使它停止,可以使用下面的函数接口:
rt_err_t rt_timer_stop(rt_timer_t timer