关于机器学习:RTThread学习笔记-8RTThread时钟管理学习总结

4次阅读

共计 2339 个字符,预计需要花费 6 分钟才能阅读完成。

工夫,不论在任何生存场合,都是一个十分重要概念。试想一下,如果没有了工夫,这个世界简直所有的事物都会乱套,但同时很多科学家也会提出疑难,在主观世界外面,工夫是实在存在的吗?(扯得有点远~ 哈哈)

回到正题,任何操作系统的运行,都离不开工夫。因为操作系统须要有一个界定规范,去布局各种过程或线程的运行,工夫就是这个对立的规范。操作系统通过工夫的流逝,定期去查看线程是否曾经达到调度规范,定期去查看是否有一些定时工作须要执行,等等。

对于 RT-Thread 时钟治理相干的内容,官网提供了比拟丰盛的文档作为参考,具体能够查看以下链接:
https://www.rt-thread.org/doc…

本文尝试从以下几个方面总结一下 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/r…
https://gitee.com/embediot/rt…

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

在 timer_test.h 头文件外面,通过关上相应的宏定义开关,从新编译工程源码,下载到开发板即可验证试验景象,如下图所示。

定时器应用的注意事项

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

1. 应该依据不同的利用场合,设置零碎的时钟节奏,时钟节奏个别是 1 – 100ms,时钟节奏的数值越小,示意频率越快,零碎的额定开销就会越大。

2. 在零碎节奏的中断函数外面,会一直查看硬件定时器链表,如果有定时器超时工夫达到,就会去解决相应的超时工作,超时后就会从链表中移除这个定时器,对于周期性定时器,再次启动时会重新加入链表。

3. 定时器链表的跳表算法,是用空间来换取工夫的,所以要依据理论的硬件资源设置跳表的层数,示意跳表层数的宏定义 RT_TIMER_SKIP_LIST_LEVEL 默认为 1。

4.RT-Thread 的定时器精度,是由时钟节奏来决定的,定时器的超时工夫必须是时钟节奏的整数倍,在 Cortex- M 系列的单片机中,能够应用 systick 的工作机制来取得一个低于时钟节奏的延时。

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

感激浏览!

正文完
 0