RT-Thread 时钟管理

news2024/9/22 23:32:38

时钟节拍

任何操作系统都需要提供一个时钟节拍,以供系统处理所有和时间有关的事件,如线程的延时、时间片的轮转调度以及定时器超时等。

RTT中,时钟节拍的长度可以根据RT_TICK_PER_SECOND的定义来调整。rtconfig.h配置文件中定义:

/**
 * This is the timer interrupt service routine.
 *
 */
void SysTick_Handler(void)
{
    /* enter interrupt */
    rt_interrupt_enter();

    HAL_IncTick();
    rt_tick_increase();

    /* leave interrupt */
    rt_interrupt_leave();
}

获取系统节拍

rt_tick_get();

定时器

定时器,是指从指定的时刻开始,经过一定的指定时间后触发一个事件,定时器有硬件定时器和软件定时器之分:

  • 硬件定时器:芯片本身提供的定时功能,一般由外部晶振提供给芯片输入时钟,芯片向软件模块提供一组配置寄存器,接受控制输入,到达设定时间值后芯片中断控制器产生时钟中断。
    硬件定时器的精度一般很高,可以达到纳秒级别,并且是中断触发方式。
  • 软件定时器:由操作系统提供的一类系统接口,它构建在硬件定时器基础之上,使系统能够提供不受数目限制的定时器服务。

RTT操作系统提供软件实现的定时器,以时钟节拍(OS Tick)的时间长度为单位,即定时数值必须是OS Tick的整数倍。

RTT提供的两类定时器机制

  1. 单次触发定时器,这类定时器在启动后只会触发一次定时器事件,然后定时器自动停止。
  2. 周期触发定时器,这类定时器会周期性地触发定时器事件,直到用户手动的停止,否则将永远持续执行下去。

根据定时器超时函数执行时所处的上下文环境,RT-Thread的定时器可以分为HARD_TIMER模式和SOFT_TIMER模式。
HARD_TIMER模式:中断上下文
定时器超时函数的要求:执行时间应该尽量短,执行时不应导致当前上下文挂起、等待。例如在中断上下文中执行超时函数不应该试图去申请动态内存、释放动态内存等。

SOFT_TIMER模式:线程上下文
该模式被弃用后,系统会在初始化时创建一个timer线程,然后SOFT_TIMER模式的定时器超时函数都会在timer线程的上下文环境中执行。

定时器工作机制

在RTT定时器模块中维护着两个重要的全局变量:

  • 当前系统经过的tick时间rt_tick(当硬件定时器中断来临时,它将加1)。
  • 定时器链表rt_timer_list。系统新创建并激活的定时器都会按照以超时时间排序的方式插入到rt_timer_list链表中。

系统当前tick值为20,在当前系统中以及创建并启动了三个定时器。
分别是定时时间为50个tick的Timer1、100个tick的Timer2和500个tick的Timer3.
这三个定时器分别加上系统当前时间rt_tick=20,从小到大排序链接在rt_timer_list链表中。
在这里插入图片描述
rt_tick随着硬件定时器的触发一直在增加(每一次硬件定时器中断来临,rt_tick变量会加1),50个tick以后,rt_tick从20增长到70,与Timer1的timeout值相等,这时会触发与Timer1定时器相关联的超时函数,同时将Timer1从rt_timer_list链表上删除。同理,100个tick和500个tick过去后,与Timer2和Timer3定时器相关联的超时函数会被触发,接着将Timer2和Timer3定时器从rt_timer_list链表删除。

如果系统当前定时器状态在10个tick以后(rt_tick=30)有一个任务新创建了一个tick值为300的Timer4定时器,由于Timer4定时器的timeout=rt_tick+300=330,因此它被插入到Timer2和Timer3定时器中间,形成如下图所示链表结构:
在这里插入图片描述

高精度延时

此函数只支持低于1个OS Tick的延时,否则SysTick会出现溢出而不能够获取指定的延时时间。
void rt_hw_us_delay(rt_uint32_t us);//只支持小于1ms的延时

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/931538.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

软件测试用例经典方法 |一文了解软件测试规范

软件测试规范是测试工作的依据和准则,在进行软件测试时,应在相关国标文件的要求和指导下完成测试工作,这样可以从根本上保证软件测试工作的质量,进而提升软件产品的质量。 一个完整的软件测试规范应该包括对规范本身的详细说明&a…

Python(.pyc)反编译:pycdc工具安装与使用

本文将介绍如何将python的.pyc文件反编译成源码,以便我们对源码的学习与改进。pycdc工具安装 下载地址: 1、Github地址:https://github.com/zrax/pycdc ,下载后需要使用CMake进行编译。 2、已下载好及编译好的地址:ht…

Java多线程(十二)

目录 一、多线程环境使用哈希表 1.1 HashTable 1.2 ConcurrentHashTable 二、ConcurrentHashMap和Hashtable、HashMap 的区别 一、多线程环境使用哈希表 HashMap 本身就是线程不安全的,所以在多线程的环境下可以使用:HashTable、 ConcurrentHashMap 1.…

Mysql中explain执行计划信息中字段详解

Mysql中explain执行计划信息中字段详解 1. 获取执行计划2. 字段含义2.1 id2.2 select_type2.3 table2.4 partitions2.5 type2.6 possible_keys2.7 key2.8 ley_len2.9 ref2.10 rows2.11 extra 1. 获取执行计划 explain select * from t1; --或 desc select * from t1;2. 字段含…

Pandas数据分析教程-数据清洗-扩展数据类型

pandas-02-数据清洗&预处理 扩展数据类型1. 传统数据类型缺点2. 扩展的数据类型3. 如何转换类型文中用S代指Series,用Df代指DataFrame 数据清洗是处理大型复杂情况数据必不可少的步骤,这里总结一些数据清洗的常用方法:包括缺失值、重复值、异常值处理,数据类型统计,分…

23款奔驰GLE450轿跑升级原厂外观暗夜套件,战斗感满满的

升级的方案基本都是替换原来车身部位的镀铬件,可能会有人问:“难道直接用改色膜贴黑不好吗?”如果是贴膜的话,第一个是颜色没有那么纯正,这些镀铬件贴黑的技术难度先抛开不说,即使贴上去了,那过…

Mac电脑系统应该用什么软件进行优化清理?

作为一枚资深的Windows系统使用者,小编刚刚转向Mac系统的怀抱时,各种不适应,Windows系统中普遍使用的360清理软件目前暂时没有Mac版本的,这就让小编很是头疼了,大家的Mac都是用的什么清理软件呢? 经过一番…

Notion团队协作魔法:如何玩转数字工作空间?

Notion简介 Notion已经成为现代团队协作的首选工具之一。它不仅仅是一个笔记应用,更是一个强大的团队协作平台,能够满足多种工作场景的需求。 Notion的核心功能 Notion提供了丰富的功能,如文档、数据库、看板、日历等,满足团队的…

USB接口发展历程大全

1996年,由英特尔、微软、ibm等多家公司联合设计的usb标准问世,键盘、鼠标、智能手机以及打印机等等大多使用usb标准来实现供电和数据传输。 usb接口从诞生之初就是为了实现通用这个目的。在usb诞生之前,键盘、鼠标多使用ps二接口&#xff0c…

Doris异常处理

1、decimal 字段异常 修改为 2、连接超时 Caused by: com.mysql.cj.exceptions.CJCommunicationsException: Communications link failure The last packet successfully received from the server was 1,068 milliseconds ago. The last packet sent successfully to the ser…

kali开启SSH服务(简单无比)

1.切换到管理员用户: su root 提示输入root密码 2.启动SSH服务 命令为: /etc/init.d/ssh start 或者 systemctl start ssh 3.查看SSH服务状态是否正常运行,命令为: /etc/init.d/ssh status 图片仅供参考:

一文了解BFD技术:实现故障快速检测!

一、概诉 BFD提供了一个通用的、标准化的、介质无关的、协议无关的快速故障检测机制,有以下两大优点: 1.对相邻转发引擎之间的通道提供轻负荷、快速故障检测。 2.用单一的机制对任何介质、任何协议层进行实时检测。 BFD是一个简单的“Hello”协议。两个…

如何开发一款实景无人智能自动直播平台?抖音

随着科技的迅速发展和互联网的普及,实景无人智能直播平台逐渐成为了各行各业的热门应用。通过结合无人机、人工智能和直播技术,景无人智能直播平台为用户提供了全新的观看和体验方式。本文将深入探讨实景无人智能直播平台的搭建流程,剖析其中…

ASEMI-APT80DQ40BG二极管快速恢复特性及应用

编辑-Z 本文主要介绍了APT80DQ40BG二极管的快速恢复特性以及应用。首先,对该二极管的结构和工作原理进行了简要介绍。接着,详细阐述了其快速恢复特性及其在电源、逆变器和电动汽车等领域的应用。最后,对APT80DQ40BG二极管的优点和未来发展进…

element-ui里el-table表格操作列多横线怎么解决

错误展示 错误原因 在vue中封装了element-ui表格,然后使用插槽,fixed定位等,导致样式出现了错乱 解决方案 1、线没有对齐 /* Element-UI 的table 组件出现表格线条不对齐的问题 */ body .el-table th.gutter {display: table-cell !impor…

基于ROS2的消除重力加速度对IMU加速度影响,动态获取当前重力加速度。

消除重力加速度的影响 受力分析: IMU静止时,与IMU所在平面会有一个向上的支持力(重力反作用力),IMU就会测量的角速度就是反作用力带来的。坐标关系:IMU在平面或者斜坡,IMU的Z轴都或多或少与重力有一个夹角&#xff0c…

你真的懂分数吗?(一)——分数的数学结构和建模

早点关注我,精彩不错过! 我们小学就学过分数,是指的形如“a / b”的,表达把某对象平均分成b份中的a份那么多的含义的数。自然地,a, b一般都是整数,b ! 0;如果a,b仍然是分数的话&…

【UE】蓝图通信——事件分发器

目标 比如我现在希望点击控件蓝图A中的按钮后,蓝图B能够马上做出响应 实现步骤 1. 这里控件蓝图A叫“UI_按钮”,我在该蓝图中创建了一个名为“btnIsClicked”的事件分发器 当按钮被点击时,就会调用“btnIsClicked” 2. 蓝图B这里叫做“BP_…

Leetcode 剑指 Offer II 041. 滑动窗口的平均值

题目难度: 中等 原题链接 今天继续更新 Leetcode 的剑指 Offer(专项突击版)系列, 大家在公众号 算法精选 里回复 剑指offer2 就能看到该系列当前连载的所有文章了, 记得关注哦~ 题目描述 给定一个整数数据流和一个窗口大小,根据该滑动窗口的…

Postman —— postman实现参数化

什么时候会用到参数化 比如:一个模块要用多组不同数据进行测试 验证业务的正确性 Login模块:正确的用户名,密码 成功;错误的用户名,正确的密码 失败 postman实现参数化 在实际的接口测试中,部分参数每…