Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
学习过程总结
RT-Thread学习笔记 --(8)RT-Thread时钟管理学习总结
发布于 2021-01-06 17:26:25 浏览:1697
订阅该版
[tocm] 时间,不管在任何生活场合,都是一个非常重要概念。试想一下,假如没有了时间,这个世界几乎所有的事物都会乱套,但同时很多科学家也会提出疑问,在客观世界里面,时间是真实存在的吗?(扯得有点远~哈哈) 回到正题,任何操作系统的运行,都离不开时间。因为操作系统需要有一个界定标准,去规划各种进程或线程的运行,时间就是这个统一的标准。操作系统通过时间的流逝,定期去检查线程是否已经达到调度标准,定期去检查是否有一些定时任务需要执行,等等。 关于RT-Thread时钟管理相关的内容,官方提供了比较丰富的文档作为参考,具体可以查看以下链接: [https://www.rt-thread.org/document/site/programming-manual/timer/timer/](https://www.rt-thread.org/document/site/programming-manual/timer/timer/) 本文尝试从以下几个方面总结一下RT-Thread时钟管理的学习过程 ![1.png](https://oss-club.rt-thread.org/uploads/20210106/ed69d86288378e4bdad320389c36e062.png) ## **时钟相关的概念描述** **什么是时钟节拍?**任何操作系统都需要人为地提供一个时钟节拍,通常这个时钟节拍被称为系统心跳,而且这个系统心跳是通过一个硬件定时器来周期性提供的。这个时钟节拍就好像我们生活里面的钟表的秒针一样,每过一秒,秒针活动一格。 在操作系统里面,硬件定时器中断一次,用来记录时钟节拍的全局变量(rt_tick)就会累加,这个变量只会增加而不会减少,因为时间总是往前流逝的。比如我们初始化硬件定时器为1毫秒中断一次,那这个rt_tick每过1毫秒就会加1。 ![2.png](https://oss-club.rt-thread.org/uploads/20210106/40efb4bf246af1179109c48e220e7d0c.png) 如上图所示,硬件定时器每1毫秒中断一次,产生一个节拍。假如系统监测到在第8个节拍的时候,某个线程的时间片用完了,就会执行一次线程调度;假如在第n+1个节拍的时候,监测到某个定时器的时间到了,就会开始执行这个定时器任务。 **RT-Thread是如何实现时钟节拍的?**相信不少工程师都知道,Cortex-M系列单片机内部有一个嘀嗒时钟systick硬件定时器,RT-Thread就是使用这个systick时钟来触发定时器中断,然后实现时钟节拍的全局变量不断自增。 ![3.png](https://oss-club.rt-thread.org/uploads/20210106/80835b9dd60de368d1c457c8af8f9ab1.png) ## **定时器的管理机制** 在单片机裸机编程的时候,通常都是使用硬件定时器进行计数,当硬件定时器的计数值满足溢出条件后,就会触发定时器中断,然后我们在定时器中断里面处理任务就可以了。 在RT-Thread实时操作系统里面,提供了一种软件定时器机制,这种软件定时器的定时长度是以时钟节拍为单位的,并且定时的时间长度必须是时钟节拍的整数倍。软件定时器可以设置为单次触发或周期触发,也可以设置为HARD_TIMER模式或SOFT_TIMER模式。 **定时器HARD_TIMER模式**,这种模式下的定时器超时函数,需要在中断的上下文环境下执行,并且对于超时函数的要求与中断服务函数的要求是一致的,也就是说,超时函数的执行时间要足够短,执行时不能挂起线程,不能去申请或释放动态内存。 **定时器的SOFT_TIMER模式**,这种模式相当于启动了一个定时器线程,定时器的超时函数会在这个timer线程的上下文环境下执行,该模式使用的时候,没有HARD_TIMER模式那么复杂,因为这种模式其实就是一个定时器线程在进行工作和调度。 RT-Thread的定时器模块里面,维护了一个有序的定时器链表,这个链表是用来管理当前处于活动状态的定时器的,每次时钟节拍中断的时候,都会检测这个定时器链表,看看是否有超时时间到达。RT-Thread官方对这个定时器链表的工作机制已经做了详细的描述,如下图所示。 ![4.png](https://oss-club.rt-thread.org/uploads/20210106/579cae7a9fc5ea80bacb2c191ae26b7d.png) 对于有序链表的搜索,是比较消耗时间的,所以为了加快链表的搜索速度,RT-Thread在原来有序链表的基础上,加入了跳表算法,使用这种算法可以加快链表搜索元素的速度,提升搜索的效率,但跳表算法是一种用“空间换时间”的算法,会有一定的内存消耗。 ![5.png](https://oss-club.rt-thread.org/uploads/20210106/10f85af89a2130faa3cc4c55125f4afd.png) ## **定时器相关的API函数** RT-Thread提供了一系列API函数接口,方便开发者对定时器进行一系列操作,包括::创建/初始化定时器、启动定时器、运行定时器、删除/脱离定时器,所有定时器在定时超时后都会从定时器链表中被移除,而周期性定时器会在它再次启动时被加入定时器链表,这与定时器参数设置相关。在每次的操作系统时钟中断发生时,都会对已经超时的定时器状态参数做改变。 ![6.png](https://oss-club.rt-thread.org/uploads/20210106/3b4b0e5f4468a58a790b248533dbd514.png) ## **定时器应用示例** 定时器相关的应用示例,主要是为了验证以上定时器相关的API函数接口,这里包含两个定时器示例,分别是动态定时器示例和静态定时器示例。 示例源码下载链接: [https://github.com/embediot/rtthread_study_notes](https://www.rt-thread.org/document/site/programming-manual/timer/timer/) [https://gitee.com/embediot/rtthread_study_notes](https://www.rt-thread.org/document/site/programming-manual/timer/timer/) 动态定时器示例和静态定时器示例都是创建两个定时器,一个定时器是单次触发模式,一个定时器是周期性触发模式。 在timer_test.h头文件里面,通过打开相应的宏定义开关,重新编译工程源码,下载到开发板即可验证实验现象,如下图所示。 ![7.png](https://oss-club.rt-thread.org/uploads/20210106/ba82878cdd002f6bac42701cbcc0c4b9.png) ## **定时器使用的注意事项** RT-Thread定时器在使用的时候,为了确保定时器能正常运行,应该有以下注意事项: 1.应该根据不同的应用场合,设置系统的时钟节拍,时钟节拍一般是1 – 100ms,时钟节拍的数值越小,表示频率越快,系统的额外开销就会越大。 2.在系统节拍的中断函数里面,会不断检查硬件定时器链表,如果有定时器超时时间到达,就会去处理相应的超时任务,超时后就会从链表中移除这个定时器,对于周期性定时器,再次启动时会重新加入链表。 3.定时器链表的跳表算法,是用空间来换取时间的,所以要根据实际的硬件资源设置跳表的层数,表示跳表层数的宏定义RT_TIMER_SKIP_LIST_LEVEL默认为1。 4.RT-Thread的定时器精度,是由时钟节拍来决定的,定时器的超时时间必须是时钟节拍的整数倍,在Cortex-M系列的单片机中,可以使用systick的工作机制来获得一个低于时钟节拍的延时。 5.低于时钟节拍的高精度延时的示例函数,如下图所示。 ![8.png](https://oss-club.rt-thread.org/uploads/20210106/8441e130cea3ddf36cf2e76ae8e93a57.png) 感谢阅读! ![qrcode40.png](https://oss-club.rt-thread.org/uploads/20210106/44c54532c5d27ecb8d818f1e7e1b22cc.png)
0
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
embediot
这家伙很懒,什么也没写!
文章
11
回答
0
被采纳
0
关注TA
发私信
相关文章
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
I2C_IIC
ESP8266
UART
WIZnet_W5500
ota在线升级
cubemx
PWM
flash
freemodbus
BSP
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
编译报错
中断
Debug
rt_mq_消息队列_msg_queue
SFUD
msh
keil_MDK
ulog
C++_cpp
MicroPython
本月问答贡献
xusiwei1236
8
个答案
2
次被采纳
踩姑娘的小蘑菇
1
个答案
2
次被采纳
用户名由3_15位
9
个答案
1
次被采纳
bernard
4
个答案
1
次被采纳
RTT_逍遥
3
个答案
1
次被采纳
本月文章贡献
聚散无由
2
篇文章
15
次点赞
catcatbing
2
篇文章
5
次点赞
Wade
2
篇文章
4
次点赞
Ghost_Girls
1
篇文章
7
次点赞
xiaorui
1
篇文章
2
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部