FreeRTOS入门教程(堆和栈)

article/2025/4/27 9:14:11

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、FreeRTOS操作系统介绍
  • 二、堆
    • 1.概念介绍
    • 2.简单实现
  • 三、栈
  • 总结


前言

本篇文章正式学习FreeRTOS操作系统,我打算编写一系列文章带大家轻松快速入门FreeRTOS操作系统。

一、FreeRTOS操作系统介绍

FreeRTOS是一款开源、实时、嵌入式的操作系统,它被广泛应用于小型嵌入式系统和微控制器中。FreeRTOS的设计目标是提供一个轻量级、可移植、易于使用的实时操作系统,以协调和管理多个任务。FreeRTOS通过引入任务、信号量、消息队列、定时器等概念,使得应用程序可以按照预期的方式运行,从而实现了便捷的应用程序开发。
FreeRTOS的核心是一个调度器,它可以轮流调度多个任务,并确保它们在适当的时间运行。任务可以是周期性的、一次性的或者是某些事件驱动的。 FreeRTOS支持多种架构,包括x86、ARM、AVR等,因此可以适应不同的硬件平台和开发环境。此外,FreeRTOS还提供了丰富的API和示例代码,大大简化了开发人员在嵌入式系统中的开发工作。
FreeRTOS具有以下特点:

省内存:FreeRTOS的内核很小,最小系统只需要几千个字节的RAM空间。任务栈的大小可以动态创建,因此不会浪费内存。
可移植性:FreeRTOS可以在不同的平台上运行,无需修改代码。
实时性:FreeRTOS提供了实时调度器,任务的执行可以及时响应外部事件。
可靠性:FreeRTOS提供了对任务的优先级控制、定时器和错误处理功能,让应用程序更加稳定。
易用性:FreeRTOS提供了丰富的API和示例代码,让开发人员可以快速上手进行开发。

在使用FreeRTOS时,开发人员需要首先了解和熟悉FreeRTOS的基本概念和API。例如,需要了解任务的创建、删除、挂起、恢复等操作以及信号量、消息队列、定时器等实时操作系统的特性。在具体的应用程序开发中,开发人员可以通过组合和配置这些基本概念来实现具体的应用功能。
总之,FreeRTOS是一款可靠、可移植、省内存、易用的实时嵌入式操作系统,是小型嵌入式系统和微控制器开发的有力工具。

二、堆

1.概念介绍

堆(Heap)是计算机中的一种动态内存分配方法,是一块自由存储区域,可按需求动态分配和释放内存。堆的特点是应用程序可以根据需要在堆上分配内存大小和释放内存,而不会预留和浪费内存空间。堆的实现通常依赖于底层的操作系统或者运行时库。

堆的数据结构通常是由一个堆顶指针来表示堆的起始地址,堆中的内存被划分为多个块,每个块上都有一个头部来记录当前块的状态和大小等信息,并且块按照大小顺序排列。应用程序可以通过调用malloc和free函数来在堆上动态分配和释放内存。当在堆上分配内存时,malloc函数会在堆上找到一块足够的连续内存空间,并返回其首地址,而当释放内存时,free函数会将被释放的内存块标记为可用,并放回堆中由堆管理器维护。

2.简单实现

char heap_buf[1024];//定义一块空闲内存空间
int pos = 0;//指向分配好的空间的第一个位置/*
size:要分配内存的大小
*/
void *my_malloc(int size)
{int old_pos = pos;pos += size;//移动位置return &heap_buf[old_pos];//返回分配好的内存空间
}

这里画一张图让大家更好的理解:
在这里插入图片描述
使用:

char *buf = my_malloc(100);for (i = 0; i < 100; i++)
{buf[i] = i;
}

三、栈

在FreeRTOS中,栈起着非常重要的作用。每个任务都需要一个堆栈来存储其运行时的上下文环境和局部变量。栈的大小和分配方式都会影响到任务的执行效率和系统稳定性。

在FreeRTOS中,任务的创建时需要指定任务的堆栈大小,在任务开始前系统会为任务分配指定大小的内存空间作为堆栈。

可见栈在FreeRTOS中还是非常重要的。

我们来举一个简单的例子看看栈具体的作用实现:

这个程序看起来是非常简单的,就是在main函数中调用funA在funA函数中调用funB和funC,但是里面却包含了栈的很多知识点。
这里先提几个问题后面我们进行讲解,当指向完函数funA后程序是怎么知道要跳转回到main函数中执行retrun 0的?

void funB(void)
{}void funC(void)
{}void funA(void)
{funB();funC();
}int main(void)
{funA();retrun 0;
}

这里就需要先介绍一个非常重要的寄存器和函数栈的概念了:

LR寄存器介绍:

LR寄存器是ARM体系结构中的一种寄存器,全称为Link Register,用于存储返回地址。在ARM处理器中,函数调用时将返回地址存储在LR寄存器中。当函数返回时,处理器通过读取LR寄存器中的返回地址来跳转回调用函数的位置,从而实现函数返回和程序流转。

函数栈的介绍:

函数调用时使用的栈通常被称为函数栈。函数栈是一种数据结构,具有后进先出(LIFO)的特点,并且往往是在程序运行时通过内存分配来创建的。函数栈用于存储函数调用过程中的局部变量、函数参数、返回地址以及其他必要的堆栈帧数据。

每个函数在进入时需要在栈中创建一个堆栈帧,堆栈帧包含了函数所需的所有信息,如函数参数、局部变量、函数调用者的帧指针、返回地址等。随着函数的运行,堆栈中会不断地分配新的堆栈帧,并在函数返回时依次弹出这些帧以回收内存空间。

函数栈的常见使用场景包括:函数的参数和局部变量的存储、异常处理和调试等。

介绍完这些概念后我们就来分析上面的这个程序:

1.首先会调用到funA函数,当调用funA函数时相应的会创建出一个funA函数的栈,然后将retrun 0这段代码的返回地址保存到funA栈中的LR寄存器中。
2.进入funA函数后调用funB函数,对应的也会创建出一个funB函数的栈,然后将funC这段代码的返回地址保存到funB栈中的LR寄存器中。
3.同样的调用funC时也会创建出对应的栈用来保存返回地址。

4.当函数funB执行完成后会从栈中取出LR保存的返回地址去执行funC函数。
5.当函数funA执行完成后会从栈中取出LR保存的返回地址去执行retrun 0这条语句。

下面画一张图让大家更好的理解栈中存储的内容:

在这里插入图片描述
每一个函数都会有自己的栈空间,这些栈空间是互相独立的不会互相干扰。当执行完对应的函数后会从函数栈中将LR寄存器中保存的地址取出来去执行相对于的语句或者函数。

总结

栈在FreeRTOS中创建任务是非常重要的,每一个任务都有自己对应的栈,这些内容我们后面会讲解到。欢迎大家指点错误,也希望大家多点赞多支持,我将持续更新,后续程序源码将放在公众号中。


http://chatgpt.dhexx.cn/article/SV2SWvOg.shtml

相关文章

FreeRTOS移植到STM32

一、找一个STM32的裸机工程模板 我们以STM32F103裸机程序为例 随便找的一个裸机程序 二、去官网上下载FreeRTOS V9.0.0 源码 在移植之前&#xff0c;我们首先要获取到 FreeRTOS 的官方的源码包。这里我们提供两个下载 链 接 &#xff0c; 一 个 是 官 网 &#xff1a; http:…

韦东山freeRTOS系列教程之【第一章】FreeRTOS概述与体验

文章目录 教程目录1.1 FreeRTOS目录结构1.1 FreeRTOS目录结构1.2 核心文件1.3 移植时涉及的文件1.4 头文件相关1.4.1 头文件目录1.4.2 头文件 1.5 内存管理1.6 Demo1.7 数据类型和编程规范1.7.1 数据类型1.7.2 变量名1.7.3 函数名1.7.4 宏的名 1.8 安装Keil1.8.1 下载Keil1.8.2…

freeRTOS中文实用教程1

资料转载出处 https://www.cnblogs.com/smartjourneys/p/7073450.html 1.前言 FreeRTOS是小型多任务嵌入式操作系统&#xff0c;硬实时性。本章主要讲述任务相关特性及调度相关的知识。 任务的总体特点 任务的状态 &#xff08;1&#xff09;任务有两个状态&#xff0c;运行态…

FreeRTOS入门

目录 一、简介 二、堆的概念 三、栈的概念 四、从官方源码中精简出第一个FreeRTOS程序 五、修改官方源码增加串口打印 一、简介 FreeRTOS是一个迷你的实时操作系统内核。作为一个轻量级的操作系统&#xff0c;功能包括&#xff1a;任务管理、时间管理、信号量、消息队列、…

freeRTOS系列教程之【第一章】FreeRTOS概述与体验

文章目录 教程目录1.1 FreeRTOS目录结构1.1 FreeRTOS目录结构1.2 核心文件1.3 移植时涉及的文件1.4 头文件相关 1.4.1 头文件目录1.4.2 头文件 1.5 内存管理1.6 Demo1.7 数据类型和编程规范 1.7.1 数据类型1.7.2 变量名1.7.3 函数名1.7.4 宏的名 1.8 安装Keil 1.8.1 下载Keil1.…

【机器学习】3-4-2 流行学习

#3-4-2流行学习 import mglearn import numpy as np import matplotlib.pyplot as plt import pandas as pd from sklearn.datasets import load_breast_cancer from sklearn.datasets import make_moons from sklearn.datasets import make_blobs from sklearn.datasets impor…

【机器学习】(十八)用t-SNE进行流行学习:手写数字分类

PCA是用于变换数据的首选方法&#xff0c;也可以进行可视化&#xff0c;但它的性质&#xff08;先旋转然后减少方向&#xff09;限制了有效性。 流行学习算法&#xff1a;是一类用于可视化的算法&#xff0c;它允许进行更复杂的映射&#xff0c;通常也可以给出更好的可视化。t-…

用Python实现流行机器学习算法

对于此库的Octave/MatLab版本&#xff0c;请检查machine-learning-octave项目。 该库包含在Python中实现的流行机器学习算法的示例&#xff0c;其中包含数学背后的解释。 每个算法都有交互式Jupyter Notebook演示&#xff0c;允许您使用训练数据&#xff0c;算法配置&#xff0…

【流行学习】局部线性嵌入(Locally Linear Embedding)

一、前言 局部线性嵌入&#xff08;LLE&#xff09;假设数据在较小的局部是线性的&#xff0c;也就是说&#xff0c;某一个样本可以由它最近邻的几个样本线性表示&#xff0c;离样本远的样本对局部的线性关系没有影响&#xff0c;因此相比等距映射算法&#xff0c;降维的时间复…

流行-Manifold学习理解与应用

流行-Manifold【1】 流形&#xff0c;也就是 Manifold 。 1. 比较好的形象理解 流形学习的观点是认为&#xff0c;我们所能观察到的数据实际上是由一个低维流形映射到高维空间上的&#xff0c;即这些数据所在的空间是“嵌入在高维空间的低维流形。”。由于数据内部特征的限制&a…

【流行学习】拉普拉斯映射(Laplacian Eigenmaps)

一、前言 拉普拉斯特征映射是一种基于图的降维算法&#xff0c;它希望在原空间中相互间有相似关系的点&#xff0c;在降维后的空间中尽可能的靠近&#xff0c;从而在降维后仍能保持原有的数据结构信息。 二、主要步骤 拉普拉斯特征映射通过构建邻接矩阵为 W W W&#xff08;…

7个流行的强化学习算法及代码实现

目前流行的强化学习算法包括 Q-learning、SARSA、DDPG、A2C、PPO、DQN 和 TRPO。 这些算法已被用于在游戏、机器人和决策制定等各种应用中&#xff0c;并且这些流行的算法还在不断发展和改进&#xff0c;本文我们将对其做一个简单的介绍。 1、Q-learning Q-learning&#xff1…

流行学习,比较好的一篇博客

转载自&#xff1a;https://blog.csdn.net/sinat_32043495/article/details/78997758 嵌入在高维空间的低维流形 流形&#xff1a;局部具有欧几里得空间性质的空间 1.较好的描述转载 作者&#xff1a;暮暮迷了路 链接&#xff1a;https://www.zhihu.com/question/2401548…

深度学习—近年来流行的卷积神经网络(一)

近年来流行的卷积神经网络 1. 回顾与目标2. 近年来流行的卷积神经网络2.1 VGGNet2.1.1 感受野的概念2.1.2 感受野的计算 2.2 GooleNet2.3 ResNet 3. 结尾参考资料 1. 回顾与目标 前面几讲&#xff0c;我们以LeNet和AlexNet为例&#xff0c;详细讲解了卷积神经网络的结构。从20…

流行学习常用算法

Isomap&#xff1a;等距映射。前提假设为低维空间中的欧式距离等于高维空间中的侧地线距离&#xff0c;当然该算法具体实施时是高维空间中较近点之间的测地线距离用欧式距离代替&#xff0c;较远点距离用测地线距离用最短路径逼近。 LLE:局部线性嵌入。前提假设是数据所在的低维…

流行学习与拉普拉斯变换的推导

参考&#xff1a;拉普拉斯矩阵 参考&#xff1a;流行学习

流行学习初步理解

一. 流形学习的英文名为manifold learning。其主要思想是把一个高维的数据非线性映射到低维&#xff0c;该低维数据能够反映高维数据的本质&#xff0c;当然有一个前提假设就是高维观察数据存在流形结构&#xff0c;其优点是非参数&#xff0c;非线性&#xff0c;求解过程简单。…

流行学习简单入门与理解

最近博主再看西瓜书第十三章半监督学习&#xff0c;文章中作者提到需要少量查询的主动学习、K-means簇的聚类&#xff0c;以及流行学习。对于流行学习&#xff0c;博主也是第一次接触&#xff0c;下面我们来简单学习和理解一下流行学习。 1. 半监督学习 SSL的成立依赖于模型假…

机器学习----流行学习(manifold learning)的通俗理解

流形学习&#xff08;manifold learning&#xff09;是一类借鉴了拓扑流行概念的降维方法&#xff0c;在降维时&#xff0c;若低维流行嵌入到高维空间中&#xff0c;则数据样本在高维空间的分布虽然看上去十分复杂&#xff0c;但在局部上仍具有欧式空间&#xff08;对现实空间的…

流行学习Manifold Learning

文章目录 1、流行学习前言&#xff1a;2、流形学习的概念流形的概念&#xff1a;流行学习的概念&#xff1a; 3、流形学习的分类4、高维数据降维与可视化5、基本问题和个人观点6、参考文献 1、流行学习前言&#xff1a; 流形学习是个很广泛的概念。这里我主要谈的是自从2000年…