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

FreeRTOS移植以及核心功能

文章目录

  • freertos和ucos区别,优缺点比较
  • 移植步骤
  • 核心功能
    • 内存管理(5种内存管理策略)
    • FreeRTOS任务调度算法有三种
    • 时间管理
    • 通信管理
  • 栈管理

freertos和ucos区别,优缺点比较

FreeRTOS(Free Real-Time Operating System)和 uC/OS(Micro-controller Operating System)都是常见的实时操作系统(RTOS),用于嵌入式系统开发。它们有以下区别和特点:

FreeRTOS:

  • FreeRTOS 是由 Richard Barry 创建的免费开源的实时操作系统。
  • FreeRTOS 非常轻量级,使用较少的内存资源,适用于资源有限的嵌入式系统。
  • 提供了任务管理、调度、时间管理、同步和通信等常见的操作系统功能。
  • FreeRTOS 的核心是一个协程调度器,支持协作式多任务处理。
  • 支持多种处理器架构,包括 ARM、MIPS、X86 等。

uC/OS:

  • uC/OS 是由 Jean J. Labrosse 创建的商业实时操作系统,也有免费的开源版本(uC/OS-II)。
  • uC/OS 具有丰富的功能,提供了任务管理、调度、同步、通信、内存管理等操作系统服务。
  • 对于实时性要求较高的应用,uC/OS 提供了可选的抢占式调度方式。
  • 支持多种处理器架构,包括 ARM、MIPS、ColdFire 等。
  • uC/OS-III 是 uC/OS 的最新版本,相比于旧版本,具有更强大的功能和改进的性能。

两者的优缺点比较如下:

FreeRTOS 优点:

  • 轻量级、简单易用,适合资源受限的系统。
  • 开源免费,可根据需求修改和定制。
  • 社区活跃,有大量的文档、示例和支持资源。

FreeRTOS 缺点:

  • 功能相对较少,相比于某些商业 RTOS,可能缺乏一些高级特性和工具支持。
  • 部分功能需要额外的模块或者移植。

uC/OS 优点:

  • 提供丰富的功能,满足大部分实时系统的需求。
  • 具有商业版和开源版可供选择。
  • 支持抢占式调度,适合对实时性要求高的应用。

uC/OS 缺点:

  • 商业版需要购买授权,并且较为昂贵。
  • 文档和社区资源相对较少。

在选择 FreeRTOS 还是 uC/OS 时,应根据具体需求、项目要求、开发团队经验和资源等进行综合考虑。如果项目对资源和成本有限制,或需要轻量级的操作系统,那么选择 FreeRTOS 可能更合适。如果项目对实时性要求较高,或需要丰富的功能和工具支持,而且有购买授权的预算,那么 uC/OS 可能更适合。

移植步骤

在将FreeRTOS移植到STM32上之前,您需要进行以下配置:

  1. 配置硬件:确保您的STM32芯片与所选择的FreeRTOS版本兼容,并且具备足够的内存资源(ram资源)。您可以参考芯片的数据手册和FreeRTOS的系统要求来确认这些信息。

  2. 引入FreeRTOS源代码:将FreeRTOS源代码添加到您的项目中。您可以从FreeRTOS官方网站下载最新的稳定版本或者适用于STM32的移植版。

  3. 配置FreeRTOSConfig.h文件:这个文件包含了FreeRTOS的核心配置参数。您需要根据STM32的硬件特性和应用需求进行相应配置。以下是一些可能需要配置的参数:

    • 定时器配置:根据STM32的定时器资源,配置用于FreeRTOS的系统节拍定时器
    • 内存管理器配置:根据可用的RAM大小和需要的内存管理策略,配置内存管理器选项
    • 任务优先级配置:定义任务优先级的范围和默认优先级
    • 栈配置:为每个任务定义适当大小的栈空间
    • 优化配置:根据应用需求进行合适的编译优化设置。
  4. 创建任务:在main.c(或其他文件)中创建需要运行的任务,通过调用FreeRTOS提供的API函数进行任务的创建、启动和管理。

  5. 配置中断:根据您的应用需求,配置适当的中断处理程序,并使用FreeRTOS提供的接口函数来在中断中进行任务切换。

  6. 配置时钟和系统节拍:根据STM32的时钟设置和FreeRTOS的节拍定时器配置,确保系统节拍的准确性和稳定性。

  7. 编译和烧录:将修改后的代码编译为可执行文件,并将其烧录到STM32芯片中进行测试和调试。

请注意,以上步骤仅提供了一个大致的概述,实际移植过程可能会因STM32型号、FreeRTOS版本和应用需求而有所差异。建议您参考针对您具体芯片和FreeRTOS版本的移植指南或示例代码,以获得更详细和准确的配置信息和步骤。

核心功能

在这里插入图片描述

内存管理(5种内存管理策略)

内存管理博文

在这里插入图片描述

我移植的是内存管理4

Heap_1(只建不删)

  • 适用场景:创建的任务、队列、信号量等不需要删除。它只实现了 pvPortMalloc,没有实现 vPortFree。如果你的程序不需要删除内核对象,那么可以使用 heap_1:

Heap_2(Heap1_Pro、提供删除,产生碎片)

  • 适用场景:频繁的创建和删除任务,且所创建的任务堆栈都相同,此时不会出现碎片化的问题。Heap_2 之所以还保留,只是为了兼容以前的代码。新设计中不再推荐使用 Heap_2。建议使用 Heap_4 来替代 Heap_2,更加高效。

Heap_3(传统malloc - free)

  • Heap_3 使用标准 C 库里的 malloc、 free 函数,所以堆大小由链接器的配置决定,配置项 configTOTAL_HEAP_SIZE 不再起作用。直接用C库的 malloc - free

Heap_4(Heap2_Pro,解决碎片)

  • 跟 Heap_1、 Heap_2 一样, Heap_4 也是使用大数组来分配内存。
  • Heap_4 使用首次适应算法(first fit)来分配内存。它还会把相邻的空闲内存合并为一个更大的空闲内存,这有助于较少内存的碎片问题。(heap2的升级版)

Heap_5(Heap4_Pro,可管理分隔内存)

  • Heap_5 分配内存、释放内存的算法跟 Heap_4 是一样的。相比于 Heap_4, Heap_5 并不局限于管理一个大数组:它可以管理多块、分隔开的内存。

优缺点总结:
在这里插入图片描述

FreeRTOS任务调度算法有三种

  • 第一种是基于优先级的抢占式任务调度算法,
  • 第二种是基于优先级的时间片轮转调度算法,
  • 第三种是合作式调度算法。【默认情况为:使用时间片抢占式任务调度】不再使用了

优先级的时间片轮转调度算法是多级反馈队列调度算法的一种变体,它具有以下特点:

  1. 多级优先级:该调度算法将进程划分为多个不同的优先级队列。每个队列具有不同的优先级,通常按照优先级从高到低排序。不同的进程可以被分配到不同的队列中,根据进程的优先级确定所在队列。

  2. 时间片轮转:每个队列都采用时间片轮转的调度策略。每个进程在当前队列中运行一个固定大小的时间片,当时间片用完后,进程被放入队列尾部,并等待下一次调度。

  3. 优先级提升:为了避免低优先级进程饥饿问题,该算法引入了优先级提升机制。当一个进程在低优先级队列中等待一段时间后,其优先级会被提升到更高的队列中,以增加其获得CPU时间片的机会。

  4. 公平性和响应性:该算法旨在实现公平性和响应性的平衡。高优先级的进程会更频繁地获得CPU时间,以保证响应及时;而低优先级的进程也会有机会获得一定的CPU执行时间,以保证公平性

  5. 动态调整:根据系统负载和进程优先级的变化,该算法具有动态调整的能力。可以根据实时情况增加或减少队列的数量、调整各个队列的时间片大小,以更好地适应不同的工作负载。

通过以上特点,优先级的时间片轮转调度算法可以在满足高优先级进程响应需求的同时,确保低优先级进程也能得到一定的执行时间,从而在多任务环境中实现较好的公平性和响应性

时间管理

这里需要程序员去配置时钟和系统节拍:根据STM32的时钟设置和FreeRTOS的节拍定时器配置,确保系统节拍的准确性和稳定性。

通信管理

消息队列

  • 队列(queue)可以用于"任务到任务"、“任务到中断”、"中断到任务"直接传输信息,可以实现任务之间的通信

  • 消息队列就是一个像容器一样的东西,我们所有的任务都可以往内部写消息,然后队列会将我们的消息按顺序存下来,所有的任务也可以按顺序将其读出来

  • 队列需要明确数据的大小以及队列的长度

信号量

  • 队列(queue)可以用于传输数据:在任务之间、任务和中断之间,消息队列用于传输多个数据,占用时间按也相对较长,但是有时候我们只需要传递状态,这个状态值需要用一个数值表示,一般是用作同步的效果

  • 信号量这个名字,我们可以把它拆分来看,信号可以起到通知信号的作用,然后我们的量还可以用来表示资源的数量,当我们的量只有0和1的时候,它就可以被称作二值的信号量,只有两个状态,当我们的那个量没有限制的时候,它就可以被称作为计数型信号量。

  • 信号量也是队列的一种【因为队列创建的时候,需要传入队列的长度以及队列的大小,而我们的信号量其实就是一种特殊的队列,只不过它的大小是0,毕竟我们的信号量是不需要传递数据,只需要传递信号,然后长度是N,当N=1的时候就是二值信号量,他就只有0和1两个状态,这里的0和1两个状态是指被填入和被拿走这两个状态,当N>1时,就是我们的计数信号量,他也不传递数据,只是传递一个数量值,一般是记录我们设备的资源数量】

互斥量

  • 在项目开发中,可能会有多个任务,共用一个资源的情况,为了避免其发生冲突,二值信号量可以一定程度上避免这种事情,但是它多数还是用于同步的状况,如果任务之间出现优先级的差异,就会出现优先级反转的问题

事件组

  • 场景:一个任务,他执行之前需要经过多个条件进行判断,当这多个条件全部满足或者多个条件中的某一个条件满足他才会执行。使用事件组的优点就是不用多个信号量(标志位)去判断,创建太多的全局变量,而只需要一个事件组即可

任务通知

  • 任务通知是我们整个FreeRTOS当中的最后一个通信工具,然后他是FreeRTOS第8个大版本的时候才更新出来的产物,然后我们目前是第10个版本了,相对来说还是一个比较新的概念,并且它的功能是比较强大的,它可以一定程度上的代替二值信号量,计数信号量,队列,还有我们的事件组,并且最重要的是他是我们任务中自带的一个属性,不需要我们单独去创建对应的结构体,所以他的执行效率也快很多

栈管理

https://blog.csdn.net/ba_wang_mao/article/details/127245356

相关文章:

FreeRTOS移植以及核心功能

文章目录 freertos和ucos区别,优缺点比较移植步骤核心功能内存管理(5种内存管理策略)FreeRTOS任务调度算法有三种时间管理通信管理 栈管理 freertos和ucos区别,优缺点比较 FreeRTOS(Free Real-Time Operating System&…...

重装系统(配置环境)

这里写目录标题 0.重装系统1.python1.1 anaconda1.2 pycharm1.3 深度学习环境配置 2.java2.1.安装JDK2.2.配置JDK环境变量2.3IDEA2.4 Maven 3.大数据3.1 虚拟机3.2 Hadoop平台3.3 存储3.4 采集3.5 计算3.6 查询3.7 可视化 0.重装系统 // An highlighted block var foo bar;1.…...

docker系列-报错以及解决指南

1. windows运行docker报错Windows Hypervisor is not presentDocker Desktop is unable to detect a Hypervisor.Hardware assisted virtualization and data execution protection must be enabled in the BIOS. Docker Desktop - Windows Hypervisor is not presentDocker D…...

Vue3快速上手

1.Vue3简介 2020年9月18日,Vue.js发布3.0版本,代号:One Piece(海贼王)耗时2年多、2600次提交、30个RFC、600次PR、99位贡献者github上的tags地址:Release v3.0.0 One Piece vuejs/core GitHub 2.Vue3带…...

二叉搜索树(BST,Binary Search Tree)

文章目录 1. 二叉搜索树1.1 二叉搜索树概念1.2 二叉搜索树的查找1.3 二叉搜索树的插入1.4 二叉搜索树的删除 2 二叉搜索树的实现3 二叉搜索树的应用3.1二叉搜索树的性能分析 1. 二叉搜索树 1.1 二叉搜索树概念 二叉搜索树又称二叉排序树,它或者是一棵空树&#xf…...

分析key原理

总结: key是虚拟dom对象的标识,当数据发生变化时,vue会根据新数据生成新的虚拟dom,随后vue进行新虚拟dom与旧虚拟dom的差异比较 比较规则: ①旧虚拟dom中找到了与新虚拟dom相同的key 若虚拟dom中的内容没变&#xff0c…...

[CISCN2019 华东南赛区]Web11 SSTI

这道SSTI 差点给我渗透的感觉了 全是API 我还想去访问API看看 发现这里读取了我们的ip 我们抓包看看是如何做到的 没有东西 我们看看还有什么提示 欸 那我们可不可以直接修改参数呢 我们传递看看 发现成功了 是受控的 这里我就开始没有思路了 于是看了wp 说是ssti 那我们看…...

百度春招C++后端面经总结

这次的面经,主要都是问操作系统、网络编程、C++ 这三大方向。 能明显感觉到,C++面试和Java或者Go面试重点,Java/Go主要是问MySQL、Redis。 一、介绍一下webserver项目 服务器开始运行,创建(初始化)线程池(IO密集型,线程数n+1); 创建 epoll 对连接进行监听 监听到连…...

小程序开发一个多少钱啊

在今天的数字化时代,小程序已经成为一种非常流行的应用程序形式。由于它们的便捷性、易用性和多功能性,小程序吸引了越来越多的用户和企业。但是,很多人在考虑开发一个小程序时,都会遇到同一个问题:开发一个小程序需要…...

C# 随机数生成 Mersenne Twister 马特赛特旋转演算法 梅森旋转算法

NuGet安装MathNet.Numerics 引用: using MathNet.Numerics.Random; /// <summary>/// 包括lower&#xff0c;不包括upper/// </summary>/// <param name"lower"></param>/// <param name"upper"></param>/// <para…...

C++进阶(二)

目录 1、Vector2D 默认构造、重载 2、char 深度理解 3、深度理解简单的类操作 1、Vector2D 默认构造、重载 #include <iostream> #include <cmath>class Vector2D { private:double x; // X坐标double y; // Y坐标public:// 默认构造函数&#xff0c;将向量初…...

zoneinfo

在Linux系统中&#xff0c;zoneinfo是一个包含了世界各地时区信息的目录&#xff0c;通常位于/usr/share/zoneinfo。这个目录下的子目录和文件名对应了各个时区的名称。例如&#xff0c;/usr/share/zoneinfo/America/Los_Angeles文件就包含了美国洛杉矶的时区信息。 你可以通过…...

基于微信小程序的实验室预约管理系统设计与实现

前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f447;&#x1f3fb;…...

腾讯mini项目-【指标监控服务重构】2023-08-17

今日已办 定位昨日发现的问题 来回测试发现依然出现该问题 将 pub/sub 的库替换为原来官方基于 sarama 的实现&#xff0c;发现问题解决了&#xff0c;所以问题的根本是 kafkago 这个库本身存在问题 依据官方的实现&#xff0c;尝试自定义实现 pub/sub sarama 与 kafka-go …...

前端需要知道的计算机网络知识----网络安全,自学网络安全,学习路线图必不可少,【282G】初级网络安全学习资源分享!

网络安全&#xff08;英语&#xff1a;network security&#xff09;包含网络设备安全、网络信息安全、网络软件安全。 黑客通过基于网络的入侵来达到窃取敏感信息的目的&#xff0c;也有人以基于网络的攻击见长&#xff0c;被人收买通过网络来攻击商业竞争对手企业&#xff0…...

#循循渐进学51单片机#定时器与数码管#not.4

1、熟练掌握单片机定时器的原理和应用方法。 1&#xff09;时钟周期&#xff1a;单片机时序中的最小单位&#xff0c;具体计算的方法就是时钟源分之一。 2&#xff09;机器周期&#xff1a;我们的单片机完成一个操作的最短时间。 3)定时器&#xff1a;打开定时器“储存寄存器…...

基于Android+OpenCV+CNN+Keras的智能手语数字实时翻译——深度学习算法应用(含Python、ipynb工程源码)+数据集(五)

目录 前言总体设计系统整体结构图系统流程图 运行环境模块实现1. 数据预处理2. 数据增强3. 模型构建4. 模型训练及保存5. 模型评估6. 模型测试 系统测试1. 训练准确率2. 测试效果3. 模型应用1&#xff09;程序下载运行2&#xff09;应用使用说明3&#xff09;测试结果 相关其它…...

Linux: Cache 简介

文章目录 1. 前言2. 背景3. Cache 硬件基础3.1 什么是 Cache &#xff1f;3.2 Cache 工作原理3.3 Cache 层级架构3.4 内存架构中各级访问速度概览3.5 Cache 分类3.6 Cache 的 查找 和 组织方式3.6.1 Cache 组织相关术语3.6.2 Cache 查找3.6.2.1 Cache 查找过程概述3.6.2.2 Cach…...

常见位运算公式使用场景

判断奇偶性&#xff1a;数值 x 为偶数当且仅当 (x & 1) 0。数值 x 为奇数当且仅当 (x & 1) 1。 交换两个数&#xff1a;使用异或操作符 ^ 进行交换。假设有变量 a 和 b&#xff0c;则可以使用以下公式交换它们的值&#xff1a; a a ^ b; b a ^ b; a a ^ b;取绝…...

virtualbox配置ubuntu1804虚拟机相关流程

virtualbox配置ubuntu1804虚拟机相关流程 相关版本能解决的问题安装流程1&#xff1a;新建虚拟机安装流程2&#xff1a;配置虚拟机安装流程3&#xff1a;安装虚拟机系统安装流程4&#xff1a;设置ubuntu 相关版本 virtualbox使用VirtualBox官网下载的6.1.34 r150636 版。ubunt…...

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

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

内存分配函数malloc kmalloc vmalloc

内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

多场景 OkHttpClient 管理器 - Android 网络通信解决方案

下面是一个完整的 Android 实现&#xff0c;展示如何创建和管理多个 OkHttpClient 实例&#xff0c;分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

Qt Widget类解析与代码注释

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码&#xff0c;写上注释 当然可以&#xff01;这段代码是 Qt …...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)

笔记整理&#xff1a;刘治强&#xff0c;浙江大学硕士生&#xff0c;研究方向为知识图谱表示学习&#xff0c;大语言模型 论文链接&#xff1a;http://arxiv.org/abs/2407.16127 发表会议&#xff1a;ISWC 2024 1. 动机 传统的知识图谱补全&#xff08;KGC&#xff09;模型通过…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案

随着新能源汽车的快速普及&#xff0c;充电桩作为核心配套设施&#xff0c;其安全性与可靠性备受关注。然而&#xff0c;在高温、高负荷运行环境下&#xff0c;充电桩的散热问题与消防安全隐患日益凸显&#xff0c;成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

Caliper 配置文件解析:config.yaml

Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...

【JavaWeb】Docker项目部署

引言 之前学习了Linux操作系统的常见命令&#xff0c;在Linux上安装软件&#xff0c;以及如何在Linux上部署一个单体项目&#xff0c;大多数同学都会有相同的感受&#xff0c;那就是麻烦。 核心体现在三点&#xff1a; 命令太多了&#xff0c;记不住 软件安装包名字复杂&…...

Web 架构之 CDN 加速原理与落地实践

文章目录 一、思维导图二、正文内容&#xff08;一&#xff09;CDN 基础概念1. 定义2. 组成部分 &#xff08;二&#xff09;CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 &#xff08;三&#xff09;CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 &#xf…...