当前位置: 首页 > news >正文

STM32移植RT-Thread---时钟管理

一RTT时钟节拍概念

RT-Thread的时钟节拍(Tick)是操作系统用于管理时间和任务调度的一个基本单位。它在实时操作系统中尤为关键,用于实现任务的延时、超时管理等功能。以下是关于RT-Thread时钟节拍的简单说明:

1.Tick定义:

RT-Thread的时钟节拍(Tick)是一个周期性的计时中断,用于标识系统的时间流逝。通常,系统Tick的频率是通过硬件定时器(如系统定时器或外部定时器)来控制的。

2.延时和超时:

RT-Thread利用Tick来实现任务延时和超时控制。当任务调用延时函数(如rt_thread_delay)时,会指定一个Tick数,操作系统会根据Tick计数来确定何时唤醒该任务。

3.时钟节拍与功耗:

在低功耗应用中,可以适当降低Tick频率,从而减少时钟中断的次数,降低系统功耗。

说明:RT-Thread中,时钟节拍的长度可以根据RT_TICK_PER_SECOND的定义来调整,等于1/RT_TICK_PER_SECOND秒。

二定时器管理

定时器,是指从指定的时刻开始,经过一定的指定时间触发一个事件,比如我们每天晚上都会定闹铃。其分为软件定时器和硬件定时器。

1.软件定时器

<1>定义:软件定时器是由操作系统内核管理的定时器,依赖系统的时钟节拍(Tick)中断来计时。
<2>实现原理:每当系统Tick发生时,RT-Thread会检查软件定时器的计数值并自动递减。到达预设时间后,系统会触发定时器超时回调函数。
<3>使用场景:适合一些对精度要求不高的定时任务,例如定时打印日志、周期性状态检测等。
特点
<1>定时器受Tick影响:精度取决于系统Tick频率。例如,如果Tick的频率是1ms,那么定时器的精度也就是1ms。
<2>支持多种模式:可以设置为一次性定时器(只执行一次)或周期性定时器(定时器触发后自动重置)。
<3>资源消耗较低:不需要额外的硬件资源,适合低成本、低功耗的场景。

2.硬件定时器

<1>定义:硬件定时器由微控制器中的定时器外设实现,具有更高的精度和独立于系统Tick的计时方式。
<2>实现原理:硬件定时器通常配置为在一定时间间隔产生中断,达到设定时间后触发中断处理函数。
<3>使用场景:适合对时间精度要求高的任务,如实时控制、精确的定时信号输出等。
特点
<1>精度高:硬件定时器精度可达到微秒级,远高于系统Tick带来的软件定时器精度。
<2>不依赖系统Tick:计时与系统Tick无关,不会受到系统调度延迟等因素影响。
<3>消耗硬件资源:需要使用MCU的硬件定时器资源,数量有限制。

三定时器工作机制

1.在RTT定时器中一直维护着两个重要的全局变量

<1>当前系统经过的tick时间rt_tick;
<2>定时器链表rt_time_list。系统新创建并激活的定时器都会按着以超时时间排序的方式插入列表。

2.多个定时器的创建与排序

多个定时器的创建与排序通过以下机制完成:
<1>定时器创建:每个定时器创建时,都有一个指定的超时时间(或周期),并绑定一个回调函数。用户通过调用rt_timer_create函数创建定时器,并为其分配超时时间、回调函数等属性。
<2>定时器链表:RT-Thread将所有启动的定时器放入一个链表中,链表根据定时器的到期时间从小到大排序。这样可以保证链表头部的定时器是最先到期的。
<3>定时器插入与排序:每次创建新定时器或重启定时器时,RT-Thread都会将该定时器插入链表中的合适位置,以保持链表的有序性。这是通过遍历链表找到比当前定时器到期时间晚的节点,然后将新定时器插入到这个节点之前完成的。

3.半路添加定时器处理

当系统已有运行的定时器时,若半路添加一个新的定时器,RT-Thread会按着以下步骤进行处理:
<1>计算到期时间:新定时器的到期时间根据当前Tick值加上定时器的超时时间来计算。
<2>插入排序:RT-Thread遍历定时器链表,找到到期时间比新定时器大的第一个定时器位置,将新定时器插入到该位置之前,保持链表的有序性。
<3>无需重新排序整个链表:由于链表是按到期时间从小到大排序的,因此新定时器只需插入到合适位置即可,无需重新排序整个链表。由于链表是按到期时间从小到大排序的,因此新定时器只需插入到合适位置即可,无需重新排序整个链表。
<4>高效管理:通过这种链表插入机制,RT-Thread在添加、删除定时器时的操作复杂度为O(n),在定时器数量不多的情况下,性能影响较小。

4编程

软件定时器+多线程

#include <rtthread.h>
#include <rtdevice.h>#define DBG_TAG "main"
#define DBG_LVL DBG_LOG
#include <rtdbg.h>#define SAMPLE_UART_NAME       "uart1"    /* 串口设备名称 */#define THREAD_PRIORITY         25
#define THREAD_STACK_SIZE       512
#define THREAD_TIMESLICE        5static rt_thread_t tid1 = RT_NULL;
static rt_thread_t tid2 = RT_NULL;static rt_device_t serial;                /* 串口设备句柄 */
char str[] = "hello RT-Thread!\r\n";
char str1[]="5s\r\n";
struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT; /* 配置参数 */
/* 定时器的控制块 */
static rt_timer_t timer1;/* 线程 1 的入口函数 */
static void thread1_entry(void *parameter)
{while(1){/* 查找串口设备 */serial = rt_device_find(SAMPLE_UART_NAME);/* 以中断接收及轮询发送模式打开串口设备 */rt_device_open(serial, RT_DEVICE_FLAG_INT_RX);/* 发送字符串 */rt_device_write(serial, 0, str, (sizeof(str) - 1));rt_thread_mdelay(1000);}
}/* 线程 2 的入口函数 */
static void thread2_entry(void *parameter)
{while(1){/* 查找串口设备 */serial = rt_device_find(SAMPLE_UART_NAME);/* 以中断接收及轮询发送模式打开串口设备 */rt_device_open(serial, RT_DEVICE_FLAG_INT_RX);/* 发送字符串 */rt_device_write(serial, 0, str1, (sizeof(str1) - 1));rt_thread_mdelay(5000);}
}/* 定时器 1 超时函数 */
static void timeout1(void *parameter)
{static rt_uint32_t number=0;if(number==0)rt_pin_write(24,PIN_LOW);else  rt_pin_write(24,PIN_HIGH);number++;if(number>=2)number=0;
}int main(void)
{//设置工作模式rt_pin_mode(24,PIN_MODE_OUTPUT);/* 创建线程 1,名称是 thread1,入口是 thread1_entry*/tid1 = rt_thread_create("thread1",thread1_entry, RT_NULL,THREAD_STACK_SIZE,THREAD_PRIORITY, THREAD_TIMESLICE);/* 如果获得线程控制块,启动这个线程 */if (tid1 != RT_NULL)rt_thread_startup(tid1);/* 创建线程2,名称是 thread2,入口是 thread2_entry*/tid2 = rt_thread_create("thread2",thread2_entry, RT_NULL,THREAD_STACK_SIZE,THREAD_PRIORITY-1, THREAD_TIMESLICE);/* 如果获得线程控制块,启动这个线程 */if (tid2 != RT_NULL)rt_thread_startup(tid2);/* 创建定时器 1  周期定时器 */timer1 = rt_timer_create("timer1", timeout1,RT_NULL, 500,RT_TIMER_FLAG_PERIODIC);/* 启动定时器 1 */if (timer1 != RT_NULL) rt_timer_start(timer1);
}

相关文章:

STM32移植RT-Thread---时钟管理

一RTT时钟节拍概念 RT-Thread的时钟节拍&#xff08;Tick&#xff09;是操作系统用于管理时间和任务调度的一个基本单位。它在实时操作系统中尤为关键&#xff0c;用于实现任务的延时、超时管理等功能。以下是关于RT-Thread时钟节拍的简单说明&#xff1a; 1.Tick定义&#x…...

Jasypt 实现 yml 配置加密

文章目录 前言一、集成 Jasypt1. pom 依赖2. yml 依赖 3. 加密工具类3. 使用二、常见问题1. application.yml 失效问题2. 配置热更新失败问题 前言 jasypt 官方地址&#xff1a;https://github.com/ulisesbocchio/jasypt-spring-boot Jasypt可以为Springboot加密的信息很多&a…...

uniapp—android原生插件开发(2原生插件开发)

本篇文章从实战角度出发&#xff0c;将UniApp集成新大陆PDA设备RFID的全过程分为四部曲&#xff0c;涵盖环境搭建、插件开发、AAR打包、项目引入和功能调试。通过这份教程&#xff0c;轻松应对安卓原生插件开发与打包需求&#xff01; ***环境问题移步至&#xff1a;uniapp—an…...

NLP之ASR之moonshine:moonshine的简介、安装和使用方法、案例应用之详细攻略

NLP之ASR之moonshine&#xff1a;moonshine的简介、安装和使用方法、案例应用之详细攻略 目录 moonshine的简介 moonshine的安装和使用方法 1、安装 推荐使用uv管理Python环境 安装Moonshine包 Torch后端 TensorFlow后端 JAX后端 ONNX运行时 2、使用方法 0、测试 1…...

albert模型实现微信公众号虚假新闻分类

项目源码获取方式见文章末尾&#xff01; 600多个深度学习项目资料&#xff0c;快来加入社群一起学习吧。 《------往期经典推荐------》 项目名称 1.【基于CNN-RNN的影像报告生成】 2.【卫星图像道路检测DeepLabV3Plus模型】 3.【GAN模型实现二次元头像生成】 4.【CNN模型实现…...

OceanBase 应用实践:如何处理数据空洞,降低存储空间

问题描述 某保险行业客户的核心系统&#xff0c;从Oracle 迁移到OceanBase之后&#xff0c;发现数据存储空间出现膨胀问题&#xff0c;数据空间 datasize9857715.48M&#xff0c;实际存储占用空间17790702.00M。根据 required_mb - data_mb 值判断&#xff0c;数据空洞较为严重…...

计算机的错误计算(一百四十八)

摘要 本节探讨 MATLAB 中 附近数的正割函数与 附近数的余割函数的计算精度问题。 例1. 已知 计算 直接贴图吧&#xff1a; 另外&#xff0c;16位的正确值分别为 0.4105556037464873e9、0.3670813182326778e13、-0.2549029285657875e8 与 -0.1248777628817462e12&am…...

MySQL记录锁、间隙锁、临键锁(Next-Key Locks)详解

行级锁&#xff0c;每次操作锁住对应的行数据。锁定粒度最小&#xff0c;发生锁冲突的概率最低&#xff0c;并发度最高。 应用在InnoDB存储引擎中。InnoDB的数据是基于索引组织的&#xff0c;行锁是通过对索引上的索引项加锁来实现的&#xff0c;而不是对记录加的锁。 对于行…...

SLM401A系列42V商业照明线性恒流芯片 线性照明调光在LED模组及灯带智能球泡灯上应用

SLM401A系列型号选型&#xff1a; SLM401A10ED-7G:QFN1010-4 SLM401A15aa-7G:SOT23-3 SLM401A20aa-7G:SOT23-3 SLM401A20ED-7G:QFN1010-4 SLM401A25aa-7G:SOT23-3 SLM401A30aa-7G:SOT23-3 SLM401A40aa-7G:SOT23-3 SLM401A50aa-7G:SOT23-3 SLM401A6…...

京东零售推荐系统可解释能力详解

作者&#xff1a;智能平台 张颖 本文导读 本文将介绍可解释能力在京东零售推荐系统中的应用实践。主要内容包括以下几大部分&#xff1a;推荐系统可解释定义、系统架构、排序可解释、模型可解释、流量可解释。 推荐系统可解释定义 推荐系统可解释的核心包括三部分&#xff0…...

蓝桥杯 懒洋洋字符串--字符串读入

题目 代码 #include <iostream>using namespace std;int main(){int n;cin>>n;char s[210][4];int ans0;for(int i0;i<n;i){scanf("%s",s[i]);}for(int i0;i<n;i){char as[i][0];char bs[i][1];char cs[i][2];// cout<<a<< <<b…...

SDL打开YUV视频

文章目录 问题1&#xff1a;如何控制帧率&#xff1f;问题2&#xff1a;如何触发退出事件&#xff1f;问题3&#xff1a;如何实时调整视频窗口的大小问题4&#xff1a;YUV如何一次读取一帧的数据&#xff1f; 问题1&#xff1a;如何控制帧率&#xff1f; 单独用一个子线程给主线…...

微服务架构面试内容整理-Archaius

Archaius 是由 Netflix 开发的一个配置管理库,主要用于处理动态配置和环境配置。在微服务架构中,Archaius 允许开发者以灵活的方式管理配置,从而更好地应对变化的需求。以下是 Archaius 的主要特点、工作原理和使用场景: 主要特点 1. 动态配置: Archaius 支持动态更新配置…...

实现 Nuxt3 预览PDF文件

安装必要的库&#xff0c;这里使用PDF.js库 npm install pdfjs-dist --save 为了解决跨域问题&#xff0c;在server/api 下 创建一个请求api&#xff0c; downloadFileByProxy.ts import { defineEventHandler } from h3;export default defineEventHandler(async event >…...

udp为什么会比tcp 有更低的延迟

UDP&#xff08;User Datagram Protocol&#xff0c;用户数据报协议&#xff09;相比TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议&#xff09;具有更低的延迟&#xff0c;这主要归因于UDP协议的设计特点和机制。以下是对UDP比TCP延迟低的原因的详细…...

基于java+SpringBoot+Vue的洗衣店订单管理系统设计与实现

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; Springboot mybatis Maven mysql5.7或8.0等等组成&#x…...

HarmonyOS-消息推送

一. 服务简述 Push Kit&#xff08;推送服务&#xff09;是华为提供的消息推送平台&#xff0c;建立了从云端到终端的消息推送通道。所有HarmonyOS 应用可通过集成 Push Kit&#xff0c;实现向应用实时推送消息&#xff0c;使消息易见&#xff0c;构筑良好的用户关系&#xff0…...

数据分析:宏基因组DESeq2差异分析筛选差异物种

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍原理:计算步骤:结果:加载R包准备画图主题数据链接导入数据Differential abundance (No BP vs 2BP TA)构建`countData`矩阵过滤低丰度物种构建DESeq数据对象DESeq2差异分析画图Di…...

出海企业如何借助云计算平台实现多区域部署?

云计算de小白 如需进一步了解&#xff0c;请单击链接了解有关 Akamai 云计算的更多信息 在本文中我们将告诉大家如何在Linode云计算平台上借助VLAN快速实现多地域部署。 首先我们需要明确一些基本概念和思想&#xff1a; 部署多区域 VLAN 为了在多区域部署中在不同的 VLAN …...

硬件---1电路设计安全要点以及欧姆定律

前言&#xff1a; 一直搞的东西都偏软件&#xff0c;硬件也一直在学&#xff0c;元器件、基础电路知识、PCB设计、模电运放都学的马马虎虎&#xff0c;因此决定进行系统性学习&#xff0c;内容基本来源于手里的视频和书本以及自己的感悟。 一电路安全 1电路安全 在初期基础…...

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API&#xff0c;用于在函数组件中使用 state 和其他 React 特性&#xff08;例如生命周期方法、context 等&#xff09;。Hooks 通过简洁的函数接口&#xff0c;解决了状态与 UI 的高度解耦&#xff0c;通过函数式编程范式实现更灵活 Rea…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来

一、破局&#xff1a;PCB行业的时代之问 在数字经济蓬勃发展的浪潮中&#xff0c;PCB&#xff08;印制电路板&#xff09;作为 “电子产品之母”&#xff0c;其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透&#xff0c;PCB行业面临着前所未有的挑战与机遇。产品迭代…...

srs linux

下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935&#xff0c;SRS管理页面端口是8080&#xff0c;可…...

高危文件识别的常用算法:原理、应用与企业场景

高危文件识别的常用算法&#xff1a;原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件&#xff0c;如包含恶意代码、敏感数据或欺诈内容的文档&#xff0c;在企业协同办公环境中&#xff08;如Teams、Google Workspace&#xff09;尤为重要。结合大模型技术&…...

【决胜公务员考试】求职OMG——见面课测验1

2025最新版&#xff01;&#xff01;&#xff01;6.8截至答题&#xff0c;大家注意呀&#xff01; 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:&#xff08; B &#xff09; A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

Android15默认授权浮窗权限

我们经常有那种需求&#xff0c;客户需要定制的apk集成在ROM中&#xff0c;并且默认授予其【显示在其他应用的上层】权限&#xff0c;也就是我们常说的浮窗权限&#xff0c;那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

3403. 从盒子中找出字典序最大的字符串 I

3403. 从盒子中找出字典序最大的字符串 I 题目链接&#xff1a;3403. 从盒子中找出字典序最大的字符串 I 代码如下&#xff1a; class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

【生成模型】视频生成论文调研

工作清单 上游应用方向&#xff1a;控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...

JavaScript 数据类型详解

JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型&#xff08;Primitive&#xff09; 和 对象类型&#xff08;Object&#xff09; 两大类&#xff0c;共 8 种&#xff08;ES11&#xff09;&#xff1a; 一、原始类型&#xff08;7种&#xff09; 1. undefined 定…...

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...