自己做电影网站需要的成本/网页制作免费模板
一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的时钟节拍(Tick)是操作系统用于管理时间和任务调度的一个基本单位。它在实时操作系统中尤为关键,用于实现任务的延时、超时管理等功能。以下是关于RT-Thread时钟节拍的简单说明: 1.Tick定义&#x…...

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

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

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

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

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

计算机的错误计算(一百四十八)
摘要 本节探讨 MATLAB 中 附近数的正割函数与 附近数的余割函数的计算精度问题。 例1. 已知 计算 直接贴图吧: 另外,16位的正确值分别为 0.4105556037464873e9、0.3670813182326778e13、-0.2549029285657875e8 与 -0.1248777628817462e12&am…...

MySQL记录锁、间隙锁、临键锁(Next-Key Locks)详解
行级锁,每次操作锁住对应的行数据。锁定粒度最小,发生锁冲突的概率最低,并发度最高。 应用在InnoDB存储引擎中。InnoDB的数据是基于索引组织的,行锁是通过对索引上的索引项加锁来实现的,而不是对记录加的锁。 对于行…...

SLM401A系列42V商业照明线性恒流芯片 线性照明调光在LED模组及灯带智能球泡灯上应用
SLM401A系列型号选型: 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…...

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

蓝桥杯 懒洋洋字符串--字符串读入
题目 代码 #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:如何控制帧率?问题2:如何触发退出事件?问题3:如何实时调整视频窗口的大小问题4:YUV如何一次读取一帧的数据? 问题1:如何控制帧率? 单独用一个子线程给主线…...

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

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

udp为什么会比tcp 有更低的延迟
UDP(User Datagram Protocol,用户数据报协议)相比TCP(Transmission Control Protocol,传输控制协议)具有更低的延迟,这主要归因于UDP协议的设计特点和机制。以下是对UDP比TCP延迟低的原因的详细…...

基于java+SpringBoot+Vue的洗衣店订单管理系统设计与实现
项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: Springboot mybatis Maven mysql5.7或8.0等等组成&#x…...

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

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

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

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

Linux如何更优质调节系统性能
一、硬件优化 增加物理内存:最直接的提升系统性能的方法。内存不足时,系统会频繁进行交换(swapping)活动,这会显著降低系统的响应速度,因为磁盘IO速度远低于内存访问速度。通过增加内存,可以减…...

第三十五章 Vue路由进阶之声明式导航(跳转传参)
目录 一、引言 二、查询参数传参 2.1. 使用方式 2.2. 完整代码 2.2.1. main.js 2.2.2. App.vue 2.2.3. Search.vue 2.2.4. Home.vue 2.2.5. index.js 三、动态路由传参 3.1. 使用方式 3.2. 完整代码 3.2.1. main.js 3.2.2. App.vue 3.2.3. Search.vue 3.2.4. Hom…...

python爬虫自动库DrissionPage保存网页快照mhtml/pdf/全局截图/打印机另存pdf
目录 零一、保存网页快照的三种方法二、利用打印机保存pdf的方法 零 最近星球有人问如何使用页面打印功能,另存为pdf 一、保存网页快照的三种方法 解决方案已经放在星球内:https://articles.zsxq.com/id_55mr53xahr9a.html当然也可以看如下代码&…...

基于毫米波雷达和TinyML的车内检测、定位与分类
英文标题:In-Cabin Detection, Localization and Classification based on mmWave Radar with TinyML 作者信息: 王志飞,程一格,彭辉,周会强,王铮,刘宏全所属机构:Calterah Semico…...

小E的射击训练
问题描述 小E正在训练场进行射击练习,靶有10个环,靶心位于坐标(0, 0)。每个环对应不同的得分,靶心内(半径为1)得10分,依次向外的每个环分数减少1分。若射击点在某个半径为i的圆内,则得11-i分。…...

React的概念以及发展前景如何?
React是一个由Facebook开发的用于构建用户界面的的开源JavaScript库,它主要用于构建大型、动态的Web应用程序。React的主要特点是使用VirtualDOM(虚拟DOM)来优化性能,并使用声明式的编程方式来编写UI。 React的主要概念包括&#…...

PDF生成:全面解析,C# 如何使用iTextSharp库(或其他类似库)生成PDF文档,包括如何将位图图像嵌入PDF中。
一、概述 PDF(Portable Document Format)是一种广泛使用的文档格式,由Adobe公司在1993年推出。PDF的目标是能够在任何设备上呈现固定格式的文档,无论是在不同的操作系统、硬件设备,还是在打印时,都能保证文…...

如何选择最适合的消息队列?详解 Kafka、RocketMQ、RabbitMQ 的使用场景
引言 在日常开发中,消息队列已经成为业务场景中几乎不可或缺的一部分。无论是订单系统、日志收集、分布式事务,还是大数据实时流处理,消息队列都在支撑着这些关键环节。目前市面上常用的消息队列有三种(ActiveMQ 虽然在企业集成中仍有应用&a…...

gitlab项目如何修改主分支main为master,以及可能遇到的问题
如果你希望将 Git 仓库的主分支名称从 main 修改为 master: 1. 本地修改分支名称 首先,切换到 main 分支: git checkout main将 main 分支重命名为 master: git branch -m main master2. 更新远程仓库 将本地更改推送到远程仓库…...

RRF(Reciprocal Rank Fusion,倒数排序融合)
RRF(Reciprocal Rank Fusion,倒数排序融合) 摘要 倒数排序融合 RRF 是一种简单的方法,用于结合多个 IR(Information Retrieval) 系统的文档排名,始终比任何单独的系统产生更好的结果。 通过使用 RRF 来结合几个TREC实验的结果,并建立一个 …...