登录
|
立即注册
网站首页
网站论坛
BBS
积分充值
每日签到
搜索
MCU智学网
»
网站论坛
›
嵌入式操作系统论坛
›
RT-Thread
›
帖子
RT-Thread学习笔记-8、RT-Thread时钟管理学习总结
[复制链接]
494
0
发表于 2023-3-31 15:43:19
|
查看全部
|
阅读模式
本文包含源代码、原理图、PCB、封装库、中英文PDF等资源
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
时间,不管在任何生活场合,都是一个非常重要概念。试想一下,假如没有了时间,这个世界几乎所有的事物都会乱套,但同时很多科学家也会提出疑问,在客观世界里面,时间是真实存在的吗?(扯得有点远~哈哈)
回到正题,任何操作系统的运行,都离不开时间。因为操作系统需要有一个界定标准,去规划各种进程或线程的运行,时间就是这个统一的标准。操作系统通过时间的流逝,定期去检查线程是否已经达到调度标准,定期去检查是否有一些定时任务需要执行,等等。
关于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/rtt
hread_study_notes
https://gitee.com/embediot/rtthread_stud
y
_notes
动态定时器示例和静态定时器示例都是创建两个定时器,一个定时器是单次触发模式,一个定时器是周期性触发模式。
在
timer_test.h
头文件里面,通过打开相应的宏定义开关,重新编译工程源码,下载到开发板即可验证实验现象,如下图所示。
定时器使用的注意事项
RT-Thread
定时器在使用的时候,为了确保定时器能正常运行,应该有以下注意事项:
1、应该根据不同的应用场合,设置系统的时钟节拍,时钟节拍一般是
1 – 100ms
,时钟节拍的数值越小,表示频率越快,系统的额外开销就会越大。
2、在系统节拍的中断函数里面,会不断检查硬件定时器链表,如果有定时器超时时间到达,就会去处理相应的超时任务,超时后就会从链表中移除这个定时器,对于周期性定时器,再次启动时会重新加入链表。
3、定时器链表的跳表算法,是用空间来换取时间的,所以要根据实际的硬件资源设置跳表的层数,表示跳表层数的宏定义
RT_TIMER_SKIP_LIST_LEVEL
默认为
1
。
4、RT-Thread
的定时器精度,是由时钟节拍来决定的,定时器的超时时间必须是时钟节拍的整数倍,在
Cortex-M
系列的单片机中,可以使用
systick
的工作机制来获得一个低于时钟节拍的延时。
5、低于时钟节拍的高精度延时的示例函数,如下图所示。
感谢阅读!
举报
回复
返回列表
*
滑块验证:
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
本版积分规则
发表回复
回帖后跳转到最后一页
admin
管理员
293
主题
21
回帖
3995
积分
Ta的主页
发信息
签到
连续天
6人
签到看排名
更多
精彩推荐
RV1126 RV1109硬件设计全套参考资料包
1、介绍 RV1126和RV1109是专用于视觉处理的高性能处理器SoC,可广泛应用于智能门锁、
瑞芯微 RK3326 RK3326S 硬件参考设计分享
RK3326是为个人平板电脑和智能音频设备设计的高性能四核应用程序处理器。提供了许多嵌
更新自动建库工具PCB Footprint Expert 202
已更新至目前最新版本Footprint Expert 2024.04 自动建库工具Footprint Expert 2023.
RK1808全套资料 包含芯片手册 参考设计 硬
一、简介 随着物联网和人工智能的兴起,AIoT(AI+IoT)芯片也随之兴起,RK1808是瑞芯
瑞芯微 RK3568 硬件参考设计分享 原理图 PC
RK3568芯片介绍简介瑞芯微RK3568芯片是一款定位中高端的通用型SOC,是一款高性能低功
更多
热点动态
1.
量程自动切换数字电压表proteus仿真 程序资
2.
自制FM收音机
3.
Cadence Allegro 17.4 电子设计速成实战宝
4.
RTL8309N方案-8口Switch原理图PCB规格书
5.
思特威SC4336_数据手册 SC4336_设计应用指
6.
思特威SC3338_数据手册 SC3338_设计应用指
7.
思特威SC3336_数据手册 SC3336_设计应用指
8.
思特威SC3335_数据手册 SC3335_设计应用指
更多
随手拍
1.
量程自动切换数字电压表proteus仿真 程序资
2.
自制FM收音机
3.
免费分享 全开源全协议245W桌面充电站-无线
4.
Cadence Allegro 17.4 电子设计速成实战宝
5.
VL817-Q7 USB3.0 HUB方案 包含规格书 参考
更多
客服中心
微信扫描二维码
服务时间:周一至周日 8:30-22:00
在线客服
客服微博
产品咨询
售后中心
快速回复
返回顶部
返回列表