• 【STM32】工程配置,存储空间分别情况,常用操作


    STM32的程序和数据存储分布

    存储域意义存储介质
    Code代码域ROM
    RO-data只读数据域ROM
    RW-data可读可写数据域,指初始化为非0值的可读写数据不运行的时候ROM;运行的时候RAM
    ZI-data可读可写数据域,指初始化为0值的可读写数据RAM
    ZI-data的Stack栈:存储局部变量ZI-data的栈空间
    ZI-data的HeapHeap:使用malloc动态分配的空间ZI-data的堆空间
    程序状态与区域组成
    程序存储需要占用的ROM区Code + RO-data + RW-data
    程序执行需要占用的RAM区ZI-data + RW-data
    程序执行需要占用的ROM区Code + RO-data

    查看工程文件所需要的的ROM和RAM

    .map文件
    在这里插入图片描述

    STM32的ROM内存分布

    .map文件中搜索Load Region LR_IROM1,即可查看ROM1中的内存分布情况
    在这里插入图片描述
    在这里插入图片描述

    存储域意义
    向量表中断向量表
    Code代码
    RO-data只读数据域
    RW-data存储可读可写数据域,指初始化为非0值的可读写数据的数据

    向量表的分布

    打开文件startup_stm32f429_439xx.s,该文件中有详细的向量表分布情况
    在这里插入图片描述

    类型意义
    __initial_sp栈顶地址
    Reset_Handler复位向量地址,也就是函数入口地址
    NMI_Handler
    NMI_Handler
    HardFault_Handler
    省略

    Keil5生成的Bin/Hex文件分析

    生成的Hex中应要有向量表 Code RO-data RW-data

    存储域意义
    向量表中断向量表
    Code代码
    RO-data只读数据域
    RW-data存储可读可写数据域,指初始化为非0值的可读写数据的数据
    1. 向量表
      图中蓝色选中的区域为向量表
      在这里插入图片描述
    2. Code
      由于Code过多,这里仅展示部分Code
      在这里插入图片描述
    3. RO-data
      在main.c中定义一个常量,并在main()使用它
    const char str[] = "Hello Wolrd!";
    
    int main(void)
    {
    	char *p = str;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    查看.map文件,如下
    在这里插入图片描述
    在Hex文件中找到该地址0x0800373c

    在这里插入图片描述
    4. RW-data
    在main.c定义两个全局变量

    uint16_t tempData1 = 0x1234;
    uint16_t tempData2 = 0x5678;
    
    • 1
    • 2

    在Hex文件中找数据34 12或者78 56(先存的是低字节的数据)
    在这里插入图片描述

    STM32的RAM内存分布

    .map文件中搜索Execution Region RW_IRAM1,即可查看RAM1中的内存分布情况
    在这里插入图片描述

    存储域意义备注
    RW-data可读可写数据域,指初始化为非0值的可读写数据RW-data的数据存在ROM中,数据存放的地址见Load Addr
    ZI-data可读可写数据域,指初始化为0值的可读写数据

    查看栈顶和栈底地址

    .map中搜索STACK为栈底地址
    .map中搜索__initial_sp为栈底地址
    在这里插入图片描述

    查看堆顶和堆底地址

    .map中搜索Heap为堆底地址
    .map中搜索STACK为堆顶地址,也可以自己计算堆顶地址

    常用操作

    Keil5生成二进制文件

    fromelf --bin -o "$L@L.bin" "#L"
    在这里插入图片描述

    查看最大堆栈使用情况

    打开工程输出的.html文件
    在这里插入图片描述
    在这里插入图片描述

  • 相关阅读:
    CompletableFuture-FutureTask
    学习【Cesium】第三篇,从Cesium.Viewer查看器开始学习(学不会揍我)
    外骨骼机器人和人形机器人概览
    神经元在人体内如何分布,人体神经元怎么分布的
    Maven 中依赖使用的版本号
    LeetCode 面试题 08.08. 有重复字符串的排列组合
    VS2017/2019均适用的opencv 快速通用免重复安装配置流程
    【C++项目实现】推箱子
    [springMVC学习]10、文件上传和下载
    【操作系统】第2章 进程与线程
  • 原文地址:https://blog.csdn.net/qq_45607873/article/details/126318922