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

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


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


关于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、低于时钟节拍的高精度延时的示例函数,如下图所示。


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

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭