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

news2024/12/23 13:30:02

对于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的基础上可以管理多个非连续区域

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

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

相关文章

如何避免删库跑路?

如何避免删库跑路,这几乎是一个老生常谈的话题,也是大部分上了规模的企业都很关心的话题,京东到家、微盟、链家、思科... 在这些大企业上发生过的删库事件仍然历历在目,无论是否当事人有意为之还是系统 BUG 导致,造成的…

vue-advanced-chat 聊天控件的使用

测试代码:https://github.com/robinfoxnan/vue-advanced-chat-test0 控件源码:https://github.com/advanced-chat/vue-advanced-chat 先上个效果图: 这个控件就是专门为聊天而设计的,但是也有一些不足: 1&#xf…

国际数字影像产业园:汇聚全球力量,共绘影像新蓝图

在数字化浪潮席卷全球的今天,我们自豪地宣布,国际数字影像产业园已正式起航,以全球视野为引领,致力于推动数字影像产业的创新发展,引领全球潮流。 一、汇聚全球智慧 国际数字影像产业园以开放包容的姿态,汇…

MIX OTP——使用 ETS 加速

每次我们需要查找存储容器时,我们都需要向注册表发送一条消息。如果我们的注册表被多个进程同时访问,注册表可能会成为瓶颈! 在本章中,我们将了解 ETS(Erlang Term Storage)以及如何将其用作缓存机制。 警…

【信息系统项目管理师】常见图表

作文里面的画图题用语言描述画图过程 合同 采购综合评分标准 责任分配矩阵 成本预算表 成本估算 成本管理计划 活动清单 活动属性 变更日志 问题日志 项目章程 自己再添加更多内容 甘特图 甘特图包含以下三个含义: 1、以图形或表格的形式显示活动; 2、…

JavaScript中window对象 , location对象以及history对象使用方法详细介绍

2.BOM(Browser Object Model) 操作浏览器的。常用的浏览器对象: 1.window对象:Window 对象表示浏览器中打开的窗口。 2.location对象:Location 对象包含有关当前 URL 的信息。Location 对象是 window 对象的一部分&…

[PyTorch]:加速Pytorch 模型训练的几种方法(几行代码),最快提升八倍(附实验记录)

本篇文章转自:Some Techniques To Make Your PyTorch Models Train (Much) Faster 本篇博文概述了在不影响 PyTorch 模型准确性的情况下提高其训练性能的技术。为此,将 PyTorch 模型包装在 LightningModule 中,并使用 Trainer 类来实现各种训…

使用 Python 五年后,我发现学 python 必看这三本书!少走一半弯路

第一本 《Python编程-从入门到实践》 适合零基础的读者 豆瓣评分:9.1 推荐指数:5颗星 推荐理由: 本书是针对所有层次的 Python 读者而作的 Python 入门书。全书分为两部分: 第一部分介绍使用Python 编程所必须了解的…

将excel表格转换为element table(上)

最近有个功能需要将excel展示到html 界面里面,看是简单的一个需求也是需要费尽心思才完得成 原始数据 想要把excel 读取出来,于是使用xlsl的插件 npm i xlsx通过插件可以获取到已经分析好的数据 然后使用sheet_to_html将数据转换为html 再使用v-htm…

ROS2 RQT

1. RQT是什么 RQT是一个GUI框架,通过插件的方式实现了各种各样的界面工具。 强行解读下:RQT就像插座,任何电器只要符合插座的型号就可以插上去工作。 2.选择插件 这里我们可以选择现有的几个RQT插件来试一试,可以看到和话题、参…

视频太大怎么压缩变小?6款视频压缩软件免费版分享

视频太大怎么压缩得又小又清晰呢?无论是视频文件传输、视频文件存储,还是进行自媒体视频上传,都对视频文件的大小有一定的限制。高质量的视频文件往往伴随着文件占据大量存储空间,导致文件传输速度变慢。今天教大家6种视频压缩软件…

配置WLAN 示例

规格 仅AR129CVW、AR129CGVW-L、AR109W、AR109GW-L、AR161W、AR161EW、AR161FGW-L、AR161FW、AR169FVW、AR169JFVW-4B4S、AR169JFVW-2S、AR169EGW-L、AR169EW、AR169FGW-L、AR169W-P-M9、AR1220EVW和AR301W支持WLAN-FAT AP功能。 组网需求 如图1所示,企业使用WLAN…

搜维尔科技:数据手套为什么要选择SenseGlove

了解 SenseGlove SenseGlove 是一支由电子工程师、触觉研究人员和计算机视觉专家、XR 开发人员、UX 设计师和产品创新者组成的科幻爱好者团队,他们拥有丰富人类能力和赋予 Metaverse 意义的技能和热情。 推进触觉技术是我们实现这一目标的方式。 公司及产品背景 S…

将多个SQL查询合并的两种方式

说明:单个简单查询是非常容易的,但是为了避免多次访问访问数据库,我们会尽可能通过表关联将业务所需要的字段值一次性查出来。而有时候不太清楚表之间的关联关系(这取决于对业务的熟悉程度),或者实际情况就…

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…

2021强网杯

一、环境 网上自己找 二、步骤 2.1抛出引题 在这个代码中我们反序列&#xff0c;再序列化 <?php$raw O:1:"A":1:{s:1:"a";s:1:"b";};echo serialize(unserialize($raw));//O:1:"A":1:{s:1:"a";s:1:"b";…

RFID技术在粉末涂料配料生产线的精准应用

RFID技术在粉末涂料配料生产线的精准应用 应用背景 随着科技的快速发展&#xff0c;智能化、自动化已经成为现代工业生产的重要趋势。RFID&#xff08;无线射频识别&#xff09;技术以其独特的优势&#xff0c;如非接触式识别、高速读取、大容量数据存储等&#xff0c;在多个…

206.贪心算法:摆动序列(力扣)

代码展示 class Solution { public:int wiggleMaxLength(vector<int>& nums) {if (nums.size() < 1) return nums.size(); // 如果数组长度小于等于1&#xff0c;返回数组长度int curdiff 0; // 当前元素和前一个元素的差值int prediff 0; // 前一个差值int…

品牌推广怎么样?掌握正确做法,让品牌大放异彩!

品牌推广对于初创公司来说是一项至关重要的任务。在市场众多品牌中&#xff0c;如何脱颖而出&#xff0c;是每个品牌方都要考虑的问题。 作为一名手工酸奶品牌的创始人&#xff0c;目前全国复制了100多家门店&#xff0c;我来分享下&#xff0c;如何推广&#xff0c;可以让品牌…

Git 基础-创建版本库 git init、添加到暂存区git add、查看状态git status、查看改动git diff

1.创建版本库 git init 在目录中创建新的 Git 仓库。 你可以在任何时候、任何目录中这么做&#xff0c;完全是本地化的。 在目录中执行 git init&#xff0c;就可以创建一个 Git 仓库了。 注意: 没事不要手动修改 .git 目录里面的文件&#xff0c;不然改乱了&#xff0c;可能就…