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);
}

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

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

相关文章

Am I Isolated:一款安全态势基准测试工具

基于Rust的容器运行时扫描器作为一个容器运行&#xff0c;检测用户容器运行时隔离中的漏洞。 它还提供指导&#xff0c;帮助用户改善运行时环境&#xff0c;以提供更强的隔离保证。 容器的现状是它们并不包含&#xff08;隔离&#xff09;。 容器隔离的缺失在云原生环境中有…

SQLite的BLOB数据类型与C++二进制存储学习记录

一、BLOB数据类型简介 Blob&#xff08;Binary Large Object&#xff09;是一种用于存储二进制数据的数据类型&#xff0c;在数据库中常用于存储图片、音频和视频等大型&#xff08;大数据量&#xff09;的二进制数据[1-2]。需要注意的是&#xff0c;SQLite中BLOB类型的单对象最…

编写一个基于React的聊天室

前言 此前已经编写了一版后端的im&#xff0c;此次就用其作为服务端&#xff0c;可查看参考资料1 代码 使用WebStorm创建React项目 安装依赖包 PS C:\learn-demo\front\chatroom> npm installadded 183 packages, and audited 184 packages in 16s43 packages are looki…

Javascript事件循环流程分析

基础概念 事件循环&#xff08;Event Loop&#xff09;&#xff1a;事件循环是JavaScript运行时环境中的一个循环机制&#xff0c;它不断地检查调栈用和任务队列。当调用栈为空时&#xff0c;事件循环会首先检查微任务队列&#xff0c;并执行其中的所有任务。只有当微任务队列…

解决使用Golang的email库发送qq邮件报错short response,错误类型为textproto.ProtocolError

问题阐述 使用email库发送QQ邮件&#xff0c;采用587端口&#xff1a; package mainimport ("fmt""net/smtp""github.com/jordan-wright/email" )func SendEmail(sendTo string, subject string, body string) (err error) {e : email.NewEmai…

ENAS和DARTs的比较

ENAS&#xff08;Efficient Neural Architecture Search&#xff09;和DARTS&#xff08;Differentiable Architecture Search&#xff09;都是神经架构搜索&#xff08;NAS&#xff09;的有效方法&#xff0c;目标是自动化地找到高性能的神经网络结构。尽管它们都旨在解决NAS的…

题目:Wangzyy的卡牌游戏

登录 - XYOJ 思路&#xff1a; 使用动态规划&#xff0c;设dp[n]表示当前数字之和模三等于0的组合数。 状态转移方程&#xff1a;因为是模三&#xff0c;所以和的可能就只有0、1、2。等号右边的f和dp都表示当前一轮模三等于k的组合数。以第一行为例&#xff1a;等号右边表示 j转…

mysql数据库命令备份和同步

使用mysqldump备份192.168.1.198服务上的test_db数据库 mysqldump --column--statistics0 --set-gtid-purgedOFF -uroot -h 192.168.1.198 -p123456 test_db > /use/local/sql_bak/test_db.sql** 使用mysql再192.168.1.199服务上执行数据库备份文件 ** mysql -h 192.168…

ARM64的Mac Node.js前置工作,nvm在线安装

1&#xff0c;通过 终端 ping raw.githubusercontent.com 获取到ip地址185.199.110.133 2&#xff0c;终端输入sudo vi /etc/hosts&#xff0c;打开hosts文件 3&#xff0c;在最后添加 185.199.110.133 raw.githubusercontent.com 保存后退出 3.1&#xff0c;清除环境 完全…

【支付行业-支付系统架构及总结】

记得第一次看埃隆马斯克&#xff08;Elon Musk&#xff09;讲第一性原理的视频时&#xff0c;深受震撼&#xff0c;原来还可以这样处理复杂的事务。这篇文章也尝试化繁为简&#xff0c;探寻支付系统的本质&#xff0c;讲清楚在线支付系统最核心的一些概念和设计理念。 虽然支付…

模块化沙箱:深信达如何为数据安全提供全方位保护

在数字化时代&#xff0c;网络安全已经成为企业和个人不可忽视的重要议题。随着网络攻击手段的日益复杂和多样化&#xff0c;传统的安全防护措施已经难以应对日益严峻的安全挑战。在这样的背景下&#xff0c;模块化沙箱技术应运而生&#xff0c;成为网络安全领域的新宠。今天&a…

基于单片机的观赏类水草养殖智能控制系统的设计(论文+源码)

1总体设计 通过需求分析&#xff0c;本设计观赏类水草养殖智能控制系统的总体架构如图2.1所示&#xff0c;为系统总体设计框图。系统采用STM32单片机作为系统主控核心&#xff0c;利用DS18B20温度传感器、TDS传感器、CO2传感器、光敏传感器实现水草养殖环境中水温、CO2浓度、T…

基于Jeecgboot3.6.3vue3的flowable流程增加online表单的审批支持(四)online表单字段控制

更多技术支持与服务请加入我的知识星球或加我微信,名称:亿事达nbcio技术交流社区https://t.zsxq.com/iPi8F 1、首先需要配置操作规则,如下: 配置这个节点的一些字段属性,上面就是有两个隐藏了,一个可以编辑,上面的规则采用json格式保存到数据库里 2、取出这些规则 //根…

分享:文本转换工具:PDF转图片,WORD转PDF,WORD转图片

前言 鉴于网上大多数在线转换工具要么需要收费&#xff0c;要么免费后但转换质量极差的情况&#xff0c;本人开发并提供了PDF转图片&#xff0c;WORD转PDF&#xff0c;WORD转图片等的文本转换工具。 地址 http://8.134.236.93/entry/login 账号 账号&#xff1a;STAR001&a…

星环大数据平台--TDH部署

1.1 准备一台虚拟机 正常安装一台新的虚拟机&#xff0c; 内存16G&#xff0c;cpu8核&#xff0c;硬盘50G 1.2 安装前系统配置改动 修改/etc/hosts文件&#xff0c;确保hostname该文件包含节点的hostname和IP地址的映射关系列表。 hostname由数字、小写字母或“-”组成&am…

Visual Studio2022版本的下载与安装

1-首先打开微软的官网&#xff0c;下面就是链接 下载 Visual Studio Tools - 免费安装 Windows、Mac、Linux免费下载 Visual Studio IDE 或 VS Code。 在 Windows、Mac 上试用 Visual Studio Professional 或企业版。https://visualstudio.microsoft.com/zh-hans/downloads/?…

如何去除图片水印?快来试试这4种图片去水印方法!

去除图片水印是一项普遍存在的图像处理需求&#xff0c;它旨在消除水印对图片视觉效果的干扰&#xff0c;让我们能够更自由、更美观、更专业地使用图片资源。接下来&#xff0c;我们将介绍四种有效的去除图片水印的方法和工具&#xff0c;它们各自具有独特的优势和适用场景。 方…

A day a tweet(sixteen)——The better way of search of ChatGPT

Introducing ChatGPT search a/ad.及时的/及时地 ChatGPT can now search the web in a much better way than before so you get fast, timely a.有关的(relative n.亲戚,亲属;同类事物 a.比较的&#xff1b;相对的) answers with link…

selenium+chromedriver下载与安装

安装selenium 使用pip安装selenium&#xff1a; pip install selenium安装成功&#xff1a; 安装WebDriver 根据你使用的浏览器下载相应的 WebDriver。 Chrome&#xff1a;下载地址Firefox&#xff1a;下载地址Edge&#xff1a;下载地址Safari&#xff1a;下载地址 1、c…

网站模版PageAdmin网站建设模版

网站模版是搭建网站的基础&#xff0c;在当今数字化发达的年代&#xff0c;网站是各大单位在互联网上的门牌和桥梁。一个成功的官网不仅仅能够提升企业形象&#xff0c;还能将浏览用户转化为目标客户。为了达到这个网站的展示目的&#xff0c;那么选择网站模版就尤为重要。今天…