快速入门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 源代码 源码下载万套模板,程序开发,在线开发,…...
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…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...
java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别
UnsatisfiedLinkError 在对接硬件设备中,我们会遇到使用 java 调用 dll文件 的情况,此时大概率出现UnsatisfiedLinkError链接错误,原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用,结果 dll 未实现 JNI 协…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...
【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)
升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求ÿ…...
uniapp中使用aixos 报错
问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...
【 java 虚拟机知识 第一篇 】
目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...
淘宝扭蛋机小程序系统开发:打造互动性强的购物平台
淘宝扭蛋机小程序系统的开发,旨在打造一个互动性强的购物平台,让用户在购物的同时,能够享受到更多的乐趣和惊喜。 淘宝扭蛋机小程序系统拥有丰富的互动功能。用户可以通过虚拟摇杆操作扭蛋机,实现旋转、抽拉等动作,增…...
论文阅读笔记——Muffin: Testing Deep Learning Libraries via Neural Architecture Fuzzing
Muffin 论文 现有方法 CRADLE 和 LEMON,依赖模型推理阶段输出进行差分测试,但在训练阶段是不可行的,因为训练阶段直到最后才有固定输出,中间过程是不断变化的。API 库覆盖低,因为各个 API 都是在各种具体场景下使用。…...
