内核入门(六)——时钟管理

本文深入探讨了RT-Thread操作系统的时钟节拍和定时器管理,包括时钟节拍的实现方式和获取,以及定时器的基础介绍、工作机制、管理方式。时钟节拍通过硬件定时器产生,定时器分为单次触发和周期触发,并有不同的执行上下文环境。RT-Thread使用跳表算法优化定时器链表搜索效率。
摘要由CSDN通过智能技术生成

一 时钟节拍

  任何操作系统都需要提供一个时钟节拍,以供系统处理所有和时间有关的事件,如线程的延时、线程的时间片轮转调度以及定时器超时等。时钟节拍是特定的周期性中断,这个中断可以看做是系统心跳,中断之间的时间间隔取决于不同的应用,一般是1ms–100ms,时钟节拍率越快,系统的额外开销就越大,从系统启动开始计数的时钟节拍数称为系统时间。
  RT-Thread 中,时钟节拍的长度可以根据RT_TICK_PER_SECOND的定义来调整,等于1/RT_TICK_PER_SECOND 秒。

1.1 实现方式

  时钟节拍由配置为中断触发模式的硬件定时器产生, 当中断到来时, 将调用一次:void rt_tick_increase(void),通知操作系统已经过去一个系统时钟。下面的中断函数以STM32 定时器作为示例。

void SysTick_Handler(void)
{
   
/* 进入中断*/
rt_interrupt_enter();
… …
rt_tick_increase();		//对全局变量rt_tick进行自加
/* 退出中断*/
rt_interrupt_leave();
}

  其中rt_tick_increase()的代码如下。可以看到全局变量rt_tick在每经过一个时钟节拍时,值就会加1,rt_tick的值表示了系统从启动开始总共经过的时钟节拍数,即系统时间。此外,每经过一个时钟节拍时,都会检查当前线程的时间片是否用完,以及是否有定时器超时。rt_timer_check()用于检查系统硬件定时器链表,如果有定时器超时,将调用相应的超时函数。且所有定时器在定时超时后都会从定时器链表中被移除,而周期性定时器会在它再次启动时被加入定时器链表。

void rt_tick_increase(void)
{
   
struct rt_thread *thread;
/* 全局变量rt_tick 自加*/
++ rt_tick;
/* 检查时间片*/
thread = rt_thread_self();
-- thread->remaining_tick;
if (thread
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值