20190929(10) RT-Thread 时钟管理 理论部分(1)

目的:

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); 可以获取当前时钟节拍数


定时器管理
  1. 定时器类型区分

定时器分:硬件 和 软件两种定时器

硬件定时器 是芯片本身提供的定时功能。一般是由外部晶振提供给芯片输入时钟,芯片向软件模块提供一组配置寄存器,接受控制输入,到达设定时间值后芯片中断控制器产生时钟中断。硬件定时器的精度一般很高,可以达到纳秒级别,并且是中断触发方式。

软件定时器 是由操作系统提供的一类系统接口,它构建在硬件定时器基础之上,使系统能够提供不受数目限制的定时器服务
RT-Thread 使用就是软件定时器,以时钟节拍 (OS Tick)的时间长度为单位,所以定时器数值必须是 OS 整数倍 ,也就是 OS Tick=10ms, 软件定时器只能是 10ms, 20ms, 100ms 等,不能是 15ms

  1. RT-Thread 定时器模式

HARD_TIMER 默认模式,就在当前运行环境直接执行超时函数,而不会调用任何将当前线程挂起的操作
SOFT_TIMER 通过 RT_USING_TIMER_SOFT 配置,就是系统会在初始化时创建一个 timer 线程,超时函数会在这个线程中执行

  1. RT-Thread 定时器工作机制

在这里插入图片描述

假设当前系统节拍为 rt_tick = 30,现在添加一个新的定时器并且设定超时时间为timeout = 300,但是实际上当这个 timer4 被插入到定时器链表中之后,timeout = 330 也就是需要加上当前 rt_tick 的节拍数

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值