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

快速入门FreeRTOS心得(正点原子学习版)

对于FreeROTS,我第一反应想到的就是通信里的TDM(时分多址)。不同任务给予分配不同的时间间隔,也就是任务之间在每个timeslot都在来回切换。

这里有重要的一点,就是中断要短小,优先级是自高到底进行打断。

每个任务都是独立且无限循环

while(1){task1();}
while(1){task2();}

每个任务都有自己的堆栈空间,保存寄存器值

1:调度方法

抢占式调度:优先级高大于低,高优先级任务不停止低优先级就不进行。被抢占的任务会进行就绪状态。1-2-3-2-3,1最低被2抢占,2被3抢占阻塞,2已经就绪,回到2执行,3就绪执行3

时间片调度:优先级相同任务,顺序轮回调度。task1-task2-task1-task2,遇到阻塞任务直接跳到下一个任务运行

携程式调度:当前任务一直执行

2:任务状态

就绪:条件准备好了,还没执行

阻塞:因为延时等外部信号量进入阻塞

运行:同一时刻只有1个任务运行

挂起:暂停

在任务创建方面我感受最深的就是以前数据结构学的动态双向循环链表派上了用场,虽然学的时间有些长忘记了很多,但是没事看看源码或者脑图也能会议许多。本质上这些任务的是切换叫上下文切换,任务的创建在内存中。就像任务创建是分配的堆栈空间(内存)。由人工进行内存管理分配叫做静态创建,由freertos自己分配内存就叫做动态创建。

任务创建结束后,迎来了任务切换,涉及到根据优先级来决定任务出场顺序的抢占式和同优先级时分复用的时间片调度。这些任务创建切换跟内存有什么关系呢?

任务由人为创建,内存由操作系统自动申请。任务在执行时由内存中读出并出栈到cpu寄存器中(符合一个先进后出的顺序)或者叫单片机寄存器中(加载现场)。如果遇到了任务调度导致的任务切换或者中断之类的,会将cpu寄存器中保存的内容入栈到相应的任务内存中(保存现场)。所有的任务都会有一个结构体:任务控制块。当然所有任务也会属于任务链表的某一个:比如就绪表、阻塞表、挂起表、运行表,其中只有就绪列表中的任务会根据优先级来进行执行。阻塞就如其名字,任务突然不运行了,停住了,不向下执行了,就阻塞住了。一般会等待某个状态、信号量、延时之类的。我们平时将延时分为死延时和操作系统给出的延时函数,死延时相当于一个任务语句不会涉及到任务阻塞。什么时候会阻塞,比如你执行一个函数,函数需要获取一个信号量,但是该信号量未被释放(别人拿走了),你一定要拿到它,就一直等,然后你就阻塞了。由于任务调度,你会把位置让出来给次优先级就绪任务运行。
在ARM Cortex-M微控制器架构中,MSP(Main Stack Pointer)和PSP(Process Stack Pointer)是两种特殊的寄存器,它们用于管理不同的堆栈:

1. **MSP(Main Stack Pointer)**:
   - MSP是主堆栈指针,用于中断服务例程(ISRs)和系统初始化时的堆栈操作。
   - 当发生中断时,如果优先级更高的中断发生,当前中断服务例程的上下文(包括程序计数器PC、链接寄存器LR、以及一些通用寄存器)将被保存到MSP指向的堆栈中。
   - MSP通常在系统启动时由启动代码设置,并指向一个预定的内存区域。

2. **PSP(Process Stack Pointer)**:
   - PSP是进程堆栈指针,用于用户代码和任务切换。
   - 在多任务操作系统(如FreeRTOS)中,PSP用于保存任务的上下文,当任务被挂起或切换时,其上下文将被保存到PSP指向的堆栈中。
   - PSP可以在任务创建时被设置,并且每个任务可以有自己的PSP,从而拥有独立的堆栈空间。

MSP和PSP的主要区别在于它们的用途和上下文保存机制:

- **用途**:MSP主要用于中断处理,而PSP用于任务切换。
- **上下文保存**:MSP保存中断服务例程的上下文,PSP保存任务的上下文。
- **独立性**:MSP通常是全局的,而PSP可以是任务特定的。

在FreeRTOS中,当创建一个新任务时,会为该任务分配一个堆栈,并设置其PSP。当任务被切换出去时,它的寄存器和堆栈指针状态将被保存在PSP指向的堆栈中。当任务再次被调度执行时,FreeRTOS会从PSP指向的堆栈中恢复任务的状态。

在中断编程中,MSP用于快速保存和恢复当前中断的上下文,以便中断可以快速响应并返回到被中断的任务或另一个中断服务例程。

正确管理MSP和PSP对于确保程序的稳定性和实时性至关重要,特别是在中断密集型或多任务环境中。

任务控制块就是一个大的结构体,包含了很多东西。挂起一般,我目前认为就是人为暂停了,不像阻塞可以自动移除阻塞态进入就绪态,,挂起如果不进行解挂就会一直处于挂起态。

FreeRTOS能够管理 的中断等级经配置中断优先级分组为 抢占4子优先级0后分为0~15个级别,其只能控制5~15这些,越小中断优先级越高。0~4不受控制。任务优先级可以0~31,越大优先级越高。

现在已经用到了两个数据结构:栈和链表。

在队列中,队列分为两个结构,一个是队列结构体成员,另一个就是队列项了。当然一个队列也是个大结构体,队列一般是作为先进先出FIFO的代表。也可以设置为后进先出,队列空的时候读不到东西,要入队。队列满的时候读尾部成员会使其出队,成员数减1.队列可以进行址传递。当然基于队列开发的信号量分为二值信号量、互斥信号量、计数信号量

二值信号量顾名思义就是只有0,1两种形式,0代表有余,1代表信号量被占用了。信号量动态创建的时候是没有释放的,要人为释放才能获取。由于二值信号量这个特点,会造成高优先级任务被阻塞掉,低优先级任务会多执行,会对实时操作系统的优先级造成影响。为了解决这个问题得到互斥信号量,与二值信号量的区别就是,低优先级任务会被提升至与高优先级任务同等优先级,这样就可以解决优先级翻转问题。计数信号量就是在二值的基础上可以人为定义信号量大小。

事件标志组,在裸机里经常会定义一个flag全局变量,用来在按键或者其他位置进行事件判断。而freertos自带一个,不需要我们再去定义。

任务通知,固定在任务结构体内。除了队列,信号量,事件标志组不需要中介进行任务之间通信,属于直接通信。局限性:无法发送信息给ISR,ISR可以发送给任务通知,无法转播给多个任务

不支持阻塞,只能保持一个数据

任务通知可以模拟 信号量,事件标志组

也可以模拟消息 ,可以把传递的消息保存给一个值,类似于队列的功能

软件定时器:任务调度器在创建的时候会有软件定时器任务和空闲任务。软件定时器任务会有一个超时回调函数,其中不能使用可能会导致系统阻塞的函数,比如延时函数。

跟中断的用法差不多,用了(发送队列)就是运行态,不用就休眠。超时就回调处理,所有定时器都在定时器任务中处理。单次执行一次,周期的就一直周期执行。整个过程其实开启超时回调休眠,周期的就是开启 超时回调超时回调,不主动停止就不会休眠。

低功耗模式:本质经过cortex内核__WFI指令进入睡眠模式。空闲任务进入低功耗,其他任务时退出低功耗。如果有更高的功耗需求可以在睡眠之前关闭外设时钟,睡眠结束后打开外设时钟。

内存管理:与栈(Stack)不同,堆内存的分配和释放是由程序员控制的

根据划分的堆的大小(heap)

还有5个不同的内存分配函数,heap1是只能分配不能释放,heap2是在1的基础上能释放,并且能够自适应的获取内存大小。释放的内存不能与相邻内存合并。假如申请一个30的,你的一个块是35,会切掉5个给后面的内存块。而且内存碎片不能合并。heap3是C、库的内存方案,线程安全没有考虑到,heap4在3的基础上可以合并内存碎片,heap5在4的基础上可以管理多个非连续区域

相关文章:

快速入门FreeRTOS心得(正点原子学习版)

对于FreeROTS,我第一反应想到的就是通信里的TDM(时分多址)。不同任务给予分配不同的时间间隔,也就是任务之间在每个timeslot都在来回切换。 这里有重要的一点,就是中断要短小,优先级是自高到底进行打断。 …...

【博主推荐】HTML5实现简洁好看的个人简历网页模板源码

文章目录 1.设计来源1.1 主界面1.2 关于我界面1.3 工作经验界面1.4 学习教育界面1.5 个人技能界面1.6 专业特长界面1.7 朋友评价界面1.8 获奖情况界面1.9 联系我界面 2.效果和源码2.1 动态效果2.2 源代码 源码下载万套模板,程序开发,在线开发&#xff0c…...

Android应用安装过程

Android 系统源码源码-应用安装过程 Android 中应用安装的过程就是解析 AndroidManifest.xml 的过程,系统可以从 Manifest 中得到应用程序的相关信息,比如 Activity、Service、Broadcast Receiver 和 ContentProvider 等。这些工作都是由 PackageManage…...

Word中输入文字时,后面的文字消失

当在Word中输入文字时,如果发现后面的文字消失,通常是由以下3个原因造成的: 检查Insert键状态:首先确认是否误按了Insert键。如果是,请再次按下Insert键以切换回插入模式。在插入模式下,新输入的文字会插入…...

【LeetCode】合并两个有序链表

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 解题思路 水题,主要用于后面的链表的归并排序做了该题 AC代码 # Definition for singly-linked list. # class ListNode: # def __init__(self, val0, nex…...

分子AI预测赛Task1笔记

分子AI预测赛Task1笔记 实践步骤:跑通baseline → 尝试个人idea→尝试进阶baseline 一、跑通baseline 1、应当先下载数据库 下载相应的数据库 !pip install lightgbm openpyxl2、训练模型并预测结果 首先要导入相应的库和方法类,如pandas等 # 1. …...

ubuntu 安装并启用 samba

环境:ubuntu server 24.04 步骤如下: sudo apt update sudo apt install samba修改配置文件: sudo vi /etc/samba/smb.conf新增内容: [username]path /home/[username]available yesvalid users [username]read only nobrow…...

atcoder ABC 357-D题详解

atcoder ABC 357-D题详解 Problem Statement For a positive integer N, let VN​ be the integer formed by concatenating N exactly N times. More precisely, consider N as a string, concatenate N copies of it, and treat the result as an integer to get VN​. For…...

从单一到多元:EasyCVR流媒体视频汇聚技术推动安防监控智能升级

随着科技的飞速发展,视频已成为我们日常生活和工作中的重要组成部分。尤其在远程办公、在线教育、虚拟会议等领域,视频的应用愈发广泛。为了满足日益增长的视频需求,流媒体视频汇聚融合技术应运而生,它不仅改变了传统视频的观看和…...

Spring MVC数据绑定和响应——数据回写(二)JSON数据的回写

项目中已经导入了Jackson依赖,可以先调用Jackson的JSON转换的相关方法,将对象或集合转换成JSON数据,然后通过HttpServletResponse将JSON数据写入到输出流中完成回写,具体步骤如下。 1、修改文件DataController.java,在…...

怎么快速给他人分享图片?扫描二维码看图的简单做法

现在通过二维码来查看图片是一种很常见的方法,通过二维码来查看图片不仅能够减少对手机存储空间的占用,而且获取图片变得更加方便快捷,只需要扫码就能够查看图片,有利于图片的展现。很多的场景中都有图片二维码的应用,…...

【UML用户指南】-26-对高级行为建模-状态图

目录 1、概念 2、组成结构 3、一般用法 4、常用建模技术 4.1、对反应型对象建模 一个状态图显示了一个状态机。在为对象的生命期建模中 活动图展示的是跨过不同的对象从活动到活动的控制流 状态图展示的是单个对象内从状态到状态的控制流。 在UML中,用状态图…...

解决VSCode无法用ssh连接远程服务器的问题

原因: 因为windows自带的ssh无法连接远程服务器,需要用git底下的ssh.exe。 搜了很久,试过很多方法,包括替换掉环境变量中的ssh,但是都无效,最后发现是要在VSCode中配置需要使用哪个ssh.exe。 步骤&#…...

【区块链+基础设施】银联云区块链服务 | FISCO BCOS应用案例

为了顺应区块链基础设施化的发展趋势,中国银联推出了银联云区块链服务——UPBaaS,为金融行业采用区块链 技术提出了解决方案,微众银行为平台提供 FISCO BCOS 区块链开源技术支持。通过银联云区块链服务,用户可 以用可视化的方式创…...

Java SE入门及基础(61) 死锁 死锁发生条件

目录 死锁 1. 死锁的概念 2. 死锁发生条件 互斥条件 不可剥夺条件 请求与保持条件 循环等待 3. 案例分析 示例 分析 死锁 1. 死锁的概念 Deadlock describes a situation where two or more threads are blocked forever, waiting for each other 死锁描述了一种情…...

简单爬虫案例——爬取快手视频

网址:aHR0cHM6Ly93d3cua3VhaXNob3UuY29tL3NlYXJjaC92aWRlbz9zZWFyY2hLZXk9JUU2JThCJTg5JUU5JTlEJUEy 找到视频接口: 视频链接在photourl中 完整代码: import requestsimport re url https://www.kuaishou.com/graphql cookies {did: web_…...

42、nginx之nginx.conf

nginx----web服务器 一、nginx http就是apache,在国内很少。 nginx是开源的,是一款高性能,轻量级的web服务软件。 稳定性高,而且版本迭代比较快(修复bug速度比较快,安全性快) 消耗系统资源…...

高薪程序员必修课-java为什么要用并发编程

目录 前言 1. 提高性能和效率 2. 更好地响应用户 3. 优化I/O操作 具体示例 示例1:提高性能和效率 示例2:更好地响应用户 示例3:优化I/O操作 总结 前言 并发编程允许多个线程在同一时间执行任务。下面我们从多个原理角度来解释为什么J…...

postgreSQL学习

postgreSql学习 学习参考:1、命令1.1 登录1.2 关闭连接 2、常用数据类型2.1 数值类型2.2 字符串类型2.3 时间2.4 其他 3、自增主键4、sql4.1 库操作(1)创建新库(2)切换数据库(3)删库【谨慎&…...

【3】系统标定

文章目录 雷达标定相机主雷达标定底盘动力学标定车辆循迹验证建图 雷达标定 主要是为了获得到lidar到imu的tf关系。imu为父坐标lidar为子坐标。其他雷达标定到主lidar坐标系下。 标定的结果都是生成一个是四元数。 #mermaid-svg-crOWRnT4UE0jtJVy {font-family:"trebuch…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度​

一、引言:多云环境的技术复杂性本质​​ 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,​​基础设施的技术债呈现指数级积累​​。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...

【杂谈】-递归进化:人工智能的自我改进与监管挑战

递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

Cesium1.95中高性能加载1500个点

一、基本方式&#xff1a; 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)

概述 在 Swift 开发语言中&#xff0c;各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过&#xff0c;在涉及到多个子类派生于基类进行多态模拟的场景下&#xff0c;…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面

代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口&#xff08;适配服务端返回 Token&#xff09; export const login async (code, avatar) > {const res await http…...

Spring数据访问模块设计

前面我们已经完成了IoC和web模块的设计&#xff0c;聪明的码友立马就知道了&#xff0c;该到数据访问模块了&#xff0c;要不就这俩玩个6啊&#xff0c;查库势在必行&#xff0c;至此&#xff0c;它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据&#xff08;数据库、No…...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台

🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...

Spring是如何解决Bean的循环依赖:三级缓存机制

1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间‌互相持有对方引用‌,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...