IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> STM32中堆栈的理解 -> 正文阅读

[嵌入式]STM32中堆栈的理解

STM32中堆栈的理解

关于程序的内存分配

  1. 栈区(stack):由编译器自动分配和释放,存放函数的参数与返回值、局部变量等。
  2. 堆区(heap):由程序员分配管理,一般未使用(malloc函数)。
  3. 全局区与静态区:存储全局变量和静态变量,其中初始化的全局变量和静态变量在一块区域,未初始化的全局变量和静态变量在相邻的另一块区域。
  4. 文字常量区:存放常量字符串。
  5. 程序代码区:存放程序代码。

栈区、堆区、全局区静态区存储在SRAM中,文字常量区和程序代码区存放在Flash中。通过Rebuild可以看出整个内存分配。

image-20211201164234611

Code:存储代码

RO-data:存储const常量和指令

RW-data:存储初始化值不为0的全局变量、静态变量

ZI-data:存储初始化值为0的全局变量、静态变量

所以Flash = Code+RO-data+RW-data,SRAM = RW-data+ZI-data

在.map文件中也可以看见

image-20211201164745412

47648 = 0xBA20,所以SP指针的栈顶地址是0x2000BA20。

image-20211201170944581

打开.map文件可以查看程序的内存分配

image-20211201175606196

0x20000000是sram开始的地址,可以看到各段的分布。

STACK:栈区

HEAP:堆区

.data:初始化的全局变量、静态变量

.bss:未初始化或者初始化为0的全局变量、静态变量

0x08000000是flash开始的地址,可以看到各段的分布。

.constdata:文字常量区

Code:函数代码

在Options for Target页面中可以设置Flash和SRAM大小:

image-20211201165917525

我们只在启动文件中设置了栈区、堆区的大小,并未设置全局区的大小,如果有定义全局变量,则sram先给全局区分配内存,再给栈区分配内存(最后分配)。

从下图中可以看出,最后从0x2000aa20开始分配了0x1000大小的STACK栈空间。mallco.c中定义了一个大小40K的全局数组(未初始化),数组在内存的地址从0x20000020开始,大小为0xA000,再加上其他的未初始化全局数组就达到了0x2000aa20。

image-20211201170204659

目前两种内存获取方式:

  1. 同庞大的全局变量数组来圈住一块内存,然后将这个内存拿来进行内存管理和分配。

  2. 把编译器未使用的RAM部分用于做内存分配,也就是除掉RW-data+ZI-data+编译器堆+编译器栈 后剩余的RAM内存中的一部分或者全部进行内存管理和分配。这种情况下需要知道内存剩下部分的首地址和内存的尾地址,然后要用多少内存,就从首地址开始挖,做一个链表,把内存获取和释放相关信息链接起来,就能及时的对内存进行管理了。

生长方向:

  • 堆:向上生长

  • 栈:向下生长

  • 数组:向上生长

定义在栈中的数组仍然是向上生长的,局部变量是从高地址开始往低地址存。

注意:局部变量用数组过大会导致栈溢出。

void test()
{
    u32 buff[] = {0x01234567,0x89abcdef};
    u32 *p = buff;
    
    printf("0x%x", *(u32*)((u8*)p+1));
    
}

image-20211208145358477

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-12-10 11:13:10  更:2021-12-10 11:13:35 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/9 1:59:03-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码