首页 > 系统相关 >STM32的内存(堆和栈)

STM32的内存(堆和栈)

时间:2024-11-10 16:57:27浏览次数:1  
标签:FLASH RAM STM32 存放 内存 全局变量

一般来说单片机的内存指的是FLASH和RAM,当在程序中定义了全局变量、局部变量、只读变量等参数时都是会存放到对应的FLASH或者是RAM中。具体对单片机FLASH和RAM的介绍之后再写,这里只对单片机内存分配,对堆和栈以及变量的存储做一个梳理和记录。
img

1、FLASH(0x0800 0000)

FLASH主要是存放程序代码、全局变量(不为零)及常量的。下面是将FLASH内部进行细分之后的一张图。
img
STM32的FLASH是从地址0x0800 0000开始的,是向上增长的。FLASH又可以细分为这么几个部分:
(1)文本段 (Text),其中文本段中又包含可执行代码 (Executable Code)和常量 (Literal Value);例如:const int B=1中的B的地址以及我们自己写的程序代码的地址均储存在FLASH的文本段中;
(2)只读数据区域 (Read Only Data);
(3)数据复制段 (Copy of Data Section),这个段充当的作用是存放程序中初始化为非0值的全局变量的初始值,之所以要将初始值存放到这里,是因为全局变量是存放在RAM上的,RAM上的值掉电便丢失,每次上电后这些变量是要进行重新赋值的,而重新赋的值就存放在这里;
这是一个特别的情况,就是初始值不为零的全局变量,他储存的地址是在FlASH中,但开始运行程序时,这个定义的全局变量就会被拷贝到RAM中,此时若要查询变量的地址,发现是在RAM中;可通过查看ST-LINK Utility查看全局变量的地址。

2、RAM(0x2000 0000起)

相对与FLASH来说,RAM主要就是用来存储数据了,在RAM中值得关注的是堆和栈的空间,堆是向上增长的而栈是向下生长的,如果一个函数运行的时候有大量的局部变量(栈向下增长),同时程序在整个过程中malloc申请了大量的堆空间而没有释放(堆向上增长),造成堆和栈空间的冲突,一旦堆栈冲突,系统就崩溃了。
如下是STM32中RAM的分区:
img
RAM中包含了如下几个部分:
(1)data:存放初始化为非0值的全局变量;
(2)bss:存放未初始化或者是初始化为0的全局变量;
(3)堆(Heap) : 由malloc申请,由free释放;堆是程序在运行的时候用malloc或new申请任意大小的内存,程序员自己负责在适当的时候用free或delete释放内存。可以根据需要请求一段连续的内存空间,并在程序执行过程中随着数据的变化而增长或减小。
(4)栈(Stack) : 存放局部变量、函数调用时的返回地址以及中断入口等;函数执行结束时这些存储单元自动被释放,其大小主要看函数调用的深度。
这是一个特殊的内存区域,主要用于存储程序执行过程中的局部变量、函数参数和函数调用的返回地址。它是按照后进先出的原则工作的,类似于生活中的堆叠物品。

堆和栈的空间可以由我们来自由设定,可在在STM32的启动文件(.s)中,刚开头就有对堆(Head_Size)和栈(Stack_Size)空间的定义描述。堆栈是一种用于存储函数调用和局部变量的内存区域。在STM32中,堆栈通常位于SRAM中的特定区域。

标签:FLASH,RAM,STM32,存放,内存,全局变量
From: https://www.cnblogs.com/jiatai-blogs/p/18538187

相关文章

  • MAC下使用Clion软件进行STM32的HAL库的开发
    1、准备的软件(1)clion:链接:https://www.jetbrains.com.cn/clion/破解:方法可在某宝上去找。(2)STM32CubeMX与ST_Link:链接:https://www.st.com.cn/content/st_com/zh/stm32cubemx.htmlmac电脑在安装的时候会出现上面的界面,依次安装即可。(3)macOS的包管理器‌brew:打开终端......
  • 基于STM32的温室自主灌溉系统(论文+源码)
    1.总体方案设计本课题为基于STM32的温室自主灌溉系统,通过查阅多种文献和的设计了如图2.1所示的温室自主灌溉系统总体架构,整个系统在器件上包括了主控制器STM32F103,温度传感器DS18B20,土壤湿度传感器YL-69,光敏电阻,显示器LCD1602,继电器,LED灯,蜂鸣器,水泵,按键等等。在功能上,实现了......
  • stm32以太网接口:MII和RMII
    前言使用stm32和lwip进行网络通信开发时,实现结构如下:而MII和RMII就是stm32与PHY芯片之间的通信接口,类似于I2C、UART等。stm32以太网模块有专用的DMA控制器,通过AHB接口将以太网内核和存储器相连。数据发送时,先将数据从存储器以DMA传输到TXFIFO中进行缓冲,然后由MAC内核......
  • STM32基础篇:SYSTICK(系统滴答)
    systick概述Cortex-M处理器内部包含了一个简单的定时器系统嘀嗒(SysTick)。因为所有的Cortex-M芯片都带有这个定时器,软件在不同Cortex-M器件间的移植工作就得以化简。该定时器的时钟源可以是内部时钟(FCLK,CM3上的自由运行时钟),或者是外部时钟(处理器上的STCLK信号)。不过,STCLK的具体......
  • STM32基础
    一、GPIO主要知识点:1、通用GPIO概述2、GPIO的工作方式3、GPIO的相关寄存器4、GPIO的应用5、GPIO的初始化代码1、GPIO概述:GPIO是通用输入/输出的简称,是单片机和外界通讯的必要窗口。换句话来说,GPIO就像我们的计算机的显示器和键盘,我们对单片机的读写操作就是通过I/O口......
  • STM32+阿里云+ESP8266+MQTT+DHT11
    一、阿里云平台环境搭建注册完账号以后,找到控制台->物联网平台。    1.创建一个公共实例,若该实例有ID则为新公共实例2.创建一个产品[如何在物联网平台创建产品_物联网平台(IoT)-阿里云帮助中心(aliyun.com)](https://help.aliyun.com/zh/iot/user-guide/create......
  • 动态内存2
    今天我们来介绍一下剩下的两个函数,calloc函数和realloc函数,现在我们就来学习。1.calloc函数这个函数跟malloc函数的用法大致相同,唯一区别就是calloc函数在申请空间后会帮你把每个字节初始化为0。 2.realloc函数这个函数让动态内存管理更加灵活。这个函数可以实现内存大小......
  • 动态内存(c)
    大家好,今天我们就来聊聊c语言中动态内存的一些知识,相信大家很多时候在申请空间时总会有空间不够用或者太大用不完的情况吧,这个时候使用动态内存就是一个不错的选择,下面我们便来了解一下。1.malloc函数这个函数向内存申请一块连续可用的空间,并返回指向这块空间的指针,注意并不......
  • 如何对stm32的程序进行加密
    目的:保护单片机里的固件或代码不被读取出来通过代码配置 STM32的寄存器来实现读取保护(RDP)和调试接口锁定,可以采用以下方式:1.启用读取保护(RDP)可以在代码中配置RDP级别。例如在STM32F4系列中,RDP的设置存储在选项字节(OptionBytes)中。RDP的配置可以通过STM32HAL库......
  • 程序的内存模型
    内存分区模型C++程序在执行时,将内存大致分为4个区域。1.代码区:存放函数体的二进制代码,由操作系统进行管理。2.全局区:存放全局变量和静态变量以及常量。3.栈区:由编译器自动分配释放,存放函数的参数值,局部变量等。4.堆区:由程序员分配和释放,若程序员不释放,程序结束时由操作系统......