目的:
1 了解 RT 时钟实现
2 了解 RT 定时器管理
正文
RT 时钟实现
时钟节拍:可以视为系统心跳,频率越高资源消耗越大
RT 时钟节拍可以通过 RT_TICK_PER_SECOND 的定义来调整,等于 1 / RT_TICK_PER_SECOND 秒
//中断函数以 STM32 定时器
void SysTick_Handler(void) {
/* 进入中断 */
rt_interrupt_enter();
……
rt_tick_increase();
/* 退出中断 */
rt_interrupt_leave();
}
//中断函数中调用 rt_tick_increase() 对全局变量 rt_tick 累加
void rt_tick_increase(void) {
struct rt_thread *thread;
/* 全局变量 rt_tick 自加 */
++ rt_tick;
/* 检查时间片 */
thread = rt_thread_self();
-- thread->remaining_tick;
if (thread->remaining_tick == 0) {
/* 重新赋初值 */
thread->remaining_tick = thread->init_tick;
/* 线程挂起 */
rt_thread_yield();
}
/* 检查定时器 */
rt_timer_check();
}
rt_tick 记录的是从启动开始总共经历的时钟节拍数
rt_timer_check() 对于 list 中有超时定时器,会调用相关函数并且将其从 list 中移出,对于周期性定时器会在启动之后加入 list 中
rt_tick_get(void); 可以获取当前时钟节拍数
定时器管理
- 定时器类型区分
定时器分:硬件 和 软件两种定时器
硬件定时器 是芯片本身提供的定时功能。一般是由外部晶振提供给芯片输入时钟,芯片向软件模块提供一组配置寄存器,接受控制输入,到达设定时间值后芯片中断控制器产生时钟中断。硬件定时器的精度一般很高,可以达到纳秒级别,并且是中断触发方式。
软件定时器 是由操作系统提供的一类系统接口,它构建在硬件定时器基础之上,使系统能够提供不受数目限制的定时器服务
RT-Thread 使用就是软件定时器,以时钟节拍 (OS Tick)的时间长度为单位,所以定时器数值必须是 OS 整数倍 ,也就是 OS Tick=10ms, 软件定时器只能是 10ms, 20ms, 100ms 等,不能是 15ms
- RT-Thread 定时器模式
HARD_TIMER 默认模式,就在当前运行环境直接执行超时函数,而不会调用任何将当前线程挂起的操作
SOFT_TIMER 通过 RT_USING_TIMER_SOFT 配置,就是系统会在初始化时创建一个 timer 线程,超时函数会在这个线程中执行
- RT-Thread 定时器工作机制
假设当前系统节拍为 rt_tick = 30,现在添加一个新的定时器并且设定超时时间为timeout = 300,但是实际上当这个 timer4 被插入到定时器链表中之后,timeout = 330 也就是需要加上当前 rt_tick 的节拍数