当前位置:首页 > 公众号精选 > 松哥电源
[导读]时间,不管在任何生活场合,都是一个非常重要概念。试想一下,假如没有了时间,这个世界几乎所有的事物都会乱套,但同时很多科学家也会提出疑问,在客观世界里面,时间是真实存在的吗?(扯得有点远~哈哈)回到正题,任何操作系统的运行,都离不开时间。因为操作系统需要有一个界定标准,去规划各种进...

时间,不管在任何生活场合,都是一个非常重要概念。试想一下,假如没有了时间,这个世界几乎所有的事物都会乱套,但同时很多科学家也会提出疑问,在客观世界里面,时间是真实存在的吗?(扯得有点远~哈哈)


回到正题,任何操作系统的运行,都离不开时间。因为操作系统需要有一个界定标准,去规划各种进程或线程的运行,时间就是这个统一的标准。操作系统通过时间的流逝,定期去检查线程是否已经达到调度标准,定期去检查是否有一些定时任务需要执行,等等。


关于RT-Thread时钟管理相关的内容,官方提供了比较丰富的文档作为参考,具体可以查看以下链接:

https://www.rt-thread.org/document/site/programming-manual/timer/timer/


本文尝试从以下几个方面总结一下RT-Thread时钟管理的学习过程。

时钟相关的概念描述

 

什么是时钟节拍?任何操作系统都需要人为地提供一个时钟节拍,通常这个时钟节拍被称为系统心跳,而且这个系统心跳是通过一个硬件定时器来周期性提供的。这个时钟节拍就好像我们生活里面的钟表的秒针一样,每过一秒,秒针活动一格。


在操作系统里面,硬件定时器中断一次,用来记录时钟节拍的全局变量(rt_tick)就会累加,这个变量只会增加而不会减少,因为时间总是往前流逝的。比如我们初始化硬件定时器为1毫秒中断一次,那这个 rt_tick 每过1毫秒就会加1。


如上图所示,硬件定时器每1毫秒中断一次,产生一个节拍。假如系统监测到在第8个节拍的时候,某个线程的时间片用完了,就会执行一次线程调度;假如在第n 1个节拍的时候,监测到某个定时器的时间到了,就会开始执行这个定时器任务。


RT-Thread是如何实现时钟节拍的?相信不少工程师都知道,Cortex-M系列单片机内部有一个嘀嗒时钟 systick 硬件定时器,RT-Thread 就是使用这个 systick 时钟来触发定时器中断,然后实现时钟节拍的全局变量不断自增。


定时器的管理机制


在单片机裸机编程的时候,通常都是使用硬件定时器进行计数,当硬件定时器的计数值满足溢出条件后,就会触发定时器中断,然后我们在定时器中断里面处理任务就可以了。


在RT-Thread实时操作系统里面,提供了一种软件定时器机制,这种软件定时器的定时长度是以时钟节拍为单位的,并且定时的时间长度必须是时钟节拍的整数倍。软件定时器可以设置为单次触发或周期触发,也可以设置为HARD_TIMER模式或SOFT_TIMER模式。


定时器HARD_TIMER模式,这种模式下的定时器超时函数,需要在中断的上下文环境下执行,并且对于超时函数的要求与中断服务函数的要求是一致的,也就是说,超时函数的执行时间要足够短,执行时不能挂起线程,不能去申请或释放动态内存。


定时器的SOFT_TIMER模式,这种模式相当于启动了一个定时器线程,定时器的超时函数会在这个timer线程的上下文环境下执行,该模式使用的时候,没有HARD_TIMER模式那么复杂,因为这种模式其实就是一个定时器线程在进行工作和调度。


RT-Thread的定时器模块里面,维护了一个有序的定时器链表,这个链表是用来管理当前处于活动状态的定时器的,每次时钟节拍中断的时候,都会检测这个定时器链表,看看是否有超时时间到达。RT-Thread官方对这个定时器链表的工作机制已经做了详细的描述,如下图所示。


对于有序链表的搜索,是比较消耗时间的,所以为了加快链表的搜索速度,RT-Thread在原来有序链表的基础上,加入了跳表算法,使用这种算法可以加快链表搜索元素的速度,提升搜索的效率,但跳表算法是一种用“空间换时间”的算法,会有一定的内存消耗。


定时器相关的API函数


RT-Thread提供了一系列API函数接口,方便开发者对定时器进行一系列操作,包括::创建/初始化定时器、启动定时器、运行定时器、删除/脱离定时器。


所有定时器在定时超时后都会从定时器链表中被移除,而周期性定时器会在它再次启动时被加入定时器链表,这与定时器参数设置相关。在每次的操作系统时钟中断发生时,都会对已经超时的定时器状态参数做改变。

定时器应用示例


定时器相关的应用示例,主要是为了验证以上定时器相关的API函数接口,这里包含两个定时器示例,分别是动态定时器示例和静态定时器示例。


示例源码下载链接:

https://github.com/embediot/rtthread_study_notes

https://gitee.com/embediot/rtthread_study_notes


动态定时器示例和静态定时器示例都是创建两个定时器,一个定时器是单次触发模式,一个定时器是周期性触发模式。


timer_test.h头文件里面,通过打开相应的宏定义开关,重新编译工程源码,下载到开发板即可验证实验现象,如下图所示。


定时器使用的注意事项


RT-Thread定时器在使用的时候,为了确保定时器能正常运行,应该有以下注意事项:


1、应该根据不同的应用场合,设置系统的时钟节拍,时钟节拍一般是1 – 100ms,时钟节拍的数值越小,表示频率越快,系统的额外开销就会越大。


2、在系统节拍的中断函数里面,会不断检查硬件定时器链表,如果有定时器超时时间到达,就会去处理相应的超时任务,超时后就会从链表中移除这个定时器,对于周期性定时器,再次启动时会重新加入链表。


3、定时器链表的跳表算法,是用空间来换取时间的,所以要根据实际的硬件资源设置跳表的层数,表示跳表层数的宏定义RT_TIMER_SKIP_LIST_LEVEL默认为1


4、RT-Thread的定时器精度,是由时钟节拍来决定的,定时器的超时时间必须是时钟节拍的整数倍,在Cortex-M系列的单片机中,可以使用systick的工作机制来获得一个低于时钟节拍的延时。


5、低于时钟节拍的高精度延时的示例函数,如下图所示。


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

摘要:为了研究微型多旋翼的定点控制,设计并实现了一种基于RT-Thread的微型多旋翼定点控制系统。采用DigitalMotionProcessing库和双闭环PID进行姿态控制,使用磁力计与激光测距仪进行航向与高度的锁...

关键字: RT-Thread 定点控制 数据融合

香港2022年7月7日 /美通社/ -- 寿康集团有限公司(“寿康集团”或“本公司”及其附属公司,统称“本集团”;股份代号:0575.HK)旗下全资附属公司、并以香港为基地的人工智能创新公司及衰老与长寿深层生物...

关键字: 时钟 VI GE EV

日前,RT-Thread Space 高可靠性嵌入式实时操作系统完成北京轩宇信息技术有限公司(以下简称“轩宇信息”)第三方测评,测试结论表明 RT-Thread Space 嵌入式实时操作系统满足GJB7718-2012...

关键字: RT-Thread 嵌入式 航空航天

文章转自知乎[MIPI自学笔记],作者IEEE1364https://zhuanlan.zhihu.com/p/926820471 MIPI概述MIPI是MobileIndustryProcessorInterface的...

关键字: MIPI LAN 数据流 时钟

1、为设计执行综合时使用的各种设计约束是什么?1.1、创建时钟(频率、占空比)。1.2、定义输入端口的transition-time要求1.3、指定输出端口的负载值1.4、对于输入和输出,指定延迟值(输入延迟和输出延迟)...

关键字: 数字芯片 时钟 WIRE CK

如今,SoCs正变得越来越复杂,数据经常从一个时钟域传输到另一个时钟域。上图信号A由C1时钟域触发,被C2时钟域采样。根据这两个时钟之间的关系,在将数据从源时钟传输到目标时钟时,可能会出现不同类型的问题,并且这些问题的解...

关键字: 时钟 触发器 同步器 SETUP

本文主要介绍各种类型的跨时钟域问题。同步时钟是指具有已知相位和频率关系的时钟。这些时钟本质上是来自同一时钟源。根据相位和频率关系,可分为以下几类:具有相同频率和零相位差的时钟具有相同频率和固定相位差的时钟具有不同频率和可...

关键字: 异步 时钟 相位差 SETUP

跨时钟域验证可分为结构验证和功能验证两类。结构验证确保在需要的地方添加了适当的同步逻辑。功能验证确保已添加的逻辑实现了预期的功能。仅通过执行结构验证,就可以检测到许多CDC问题。这些检查比功能验证更简单、更快。因此,验证...

关键字: 时钟 数据传输 信号 TE

来源:射频百花谭规范很重要工作过的朋友肯定知道,公司里是很强调规范的,特别是对于大的设计(无论软件还是硬件),不按照规范走几乎是不可实现的。逻辑设计也是这样:如果不按规范做的话,过一个月后调试时发现有错,回头再看自己写的...

关键字: VERILOG 时钟 计数器 仿真验证

中断服务程序

关键字: 时钟 中断程序
关闭
关闭