【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;
}

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

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

uint16_t tempData1 = 0x1234;
uint16_t tempData2 = 0x5678;

在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文件
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值