FreeRTOS入门教程(堆和栈)

这篇具有很好参考价值的文章主要介绍了FreeRTOS入门教程(堆和栈)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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


前言

本篇文章正式学习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];//返回分配好的内存空间
}

这里画一张图让大家更好的理解:
freertos堆栈空间设置,FreeRTOS入门教程,单片机,stm32,mcu,arm开发
使用:

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这条语句。

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

freertos堆栈空间设置,FreeRTOS入门教程,单片机,stm32,mcu,arm开发
每一个函数都会有自己的栈空间,这些栈空间是互相独立的不会互相干扰。当执行完对应的函数后会从函数栈中将LR寄存器中保存的地址取出来去执行相对于的语句或者函数。

总结

栈在FreeRTOS中创建任务是非常重要的,每一个任务都有自己对应的栈,这些内容我们后面会讲解到。欢迎大家指点错误,也希望大家多点赞多支持,我将持续更新,后续程序源码将放在公众号中。文章来源地址https://www.toymoban.com/news/detail-615918.html

到了这里,关于FreeRTOS入门教程(堆和栈)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • stm32以及freertos 堆栈解析

    以前在mcu编程的时候没有太注意堆栈的情况,只知道需要将堆栈设置的大一点。现在逐步使用freertos,在freertos中也有关于堆栈的设置,freertos的堆栈和启动文件中的堆栈关系是什么?为了以后使用的无误,本次一次性把这些弄清楚。 堆栈是一个特定的存储区或者寄存器。一般

    2023年04月08日
    浏览(50)
  • stm32数据对齐、PRESERVE8、freertos堆栈

    避免数据在内存中跨边界存储,减少读取数据次数,提高效率,本质上是以空间换时间的做法 下图中属于同一水平位置的为同一边界 变量在同一边界里的一次存储周期就可以读取 一旦跨了上下两个边界来存储就需要至少两个存储周期来读取 根据存储器结构,如下图,参考链

    2024年02月11日
    浏览(40)
  • Java堆和栈

    Java堆和栈是Java程序中两个重要的数据结构,它们在程序的运行过程中发挥着重要的作用。本文将介绍Java堆和栈的基本概念、区别、操作以及应用场景,帮助读者更好地理解和应用这两个数据结构。 一、基本概念 Java堆(Heap)和栈(Stack)是Java程序中的两个不同的内存区域,

    2024年02月07日
    浏览(40)
  • Java中的堆和栈

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 Java数据类型在执行过程中存储在两种不同形式的内存中:栈和堆,它们通常由运行Java虚拟机(JVM)的底层平台维护。本文从Java软件开发的角度提供了对这两种内存类

    2023年04月08日
    浏览(44)
  • 面试题:堆和栈的区别

    1.管理方式不同。栈由操作系统自动分配释放,无需我们手动控制;堆的申请和释放由程序员控制,容易产生内存泄漏。 2.空间大小不同。每个进程拥有的栈大小要远远小于堆的大小。理论上进程可申请的堆大小为虚拟内存大小,进程栈的大小64bits的Windows默认1MB,64bits的Lin

    2023年04月09日
    浏览(42)
  • FreeRTOS快速入门-初探FreeRTOS

    首发,公众号【 一起学嵌入式 】 对于 RTOS 入门系列文章,已经更新完一款(RT-Thread): 助你快速入门 RT-Thread 这个系列的文章结合 RT-Thread,介绍过 RTOS 相关的核心知识。 接下来,开始另外一款 RTOS – FreeRTOS 入门系列,希望能够帮助初学者快速掌握 FreeRTOS,帮助老手回顾基

    2024年02月05日
    浏览(37)
  • 【Freertos基础入门】freertos任务的优先级

    本系列基于 stm32 系列单片机来使用freerots 任务管理是实时操作系统(RTOS)的核心功能之一,它允许开发者以并发的方式组织和管理多个任务。FreeRTOS 是一个流行的开源RTOS,它提供了强大的任务管理功能,让开发者能够轻松创建和控制任务。本文将介绍 FreeRTOS 的任务管理功能

    2024年02月13日
    浏览(35)
  • 前端高频面试题 js中堆和栈的区别和浏览器的垃圾回收机制

    栈(stack) :是栈内存的简称,栈是自动分配相对固定大小的内存空间,并由系统自动释放,栈数据结构遵循FILO(first in last out)先进后出的原则,较为经典的就是乒乓球盒结构,先放进去的乒乓球只能最后取出来。 堆(heap) :是堆内存的简称,堆是动态分配内存,内存大小不固

    2024年02月11日
    浏览(44)
  • 我在VScode学Java(Java一维数组、二维数组、JVM中的堆和栈)重制版

    ​ 我的个人博客主页:如果’\\\'真能转义1️⃣说1️⃣的博客主页 关于Java基本语法学习----可以参考我的这篇博客:《我在VScode学Java》 在Java中,数组被看作是对象。数组是用new操作符创建的。一个数组变量实际上是一个包含数组引用的变量。 (1)Java和其他高级语言都提供了

    2024年02月08日
    浏览(49)
  • FreeRTOS教程2 任务管理

    正点原子stm32f407探索者开发板V2.4 STM32CubeMX软件(Version 6.10.0) Keil µVision5 IDE(MDK-Arm) 野火DAP仿真器 XCOM V2.6串口助手 一个滑动变阻器 逻辑分析仪nanoDLA 本文主要学习FreeRTOS任务管理的相关知识, 包括FreeRTOS创建/删除任务、任务状态、任务优先级、延时函数、空闲任务和任务

    2024年03月12日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包