1.文件类型与STM32中Flash大小、SRAM大小、Hex文件大小、Bin文件大小的关系
axf文件、hex文件和bin文件都可以运行在stm32上,并且都存储了编译器根据源代码存储的机器码,在不同的应用场合中有区别;
- axf文件:包含调试信息,编译默认生成的文件,不仅包含数据代码还包含调试信息,在MDK进行Debug就是这个文件;
- hex文件:包含地址信息;
- bin文件:最直接的代码映像;
- Flash大小与Hex文件大小没有关系;
一般串口烧录时,直接烧录的是Hex文件,所以可能误以为Flash大小和Hex文件大小有关系,实际完全没有关系,真正烧进去的是二进制文件,就是在Hex文件中包含的Bin文件数据
- Hex文件大小和Bin文件大小没有决定性的关系
Hex文件内容很多,其中包含Bin文件的二进制内容,很多软件都能把Hex直接转换成Bin文件,实际烧进去的是一堆Bin文件,而不是Hex
- Flash大小和Bin文件大小相关
Bin文件就是完全的程序文件了,也就是最直接的代码映像,可以说Bin文件大小就是Flash大小,ST-Link连接进去查看的Flash程序内容就是 和 PC用WinHex打开的内容一样
2-Keil中计算Flash与SRAM大小的分布情况
Code:表示所要执行的代码,程序中所有的函数都位于此处;
RO-data: 表示只读数据,程序中所定义的全局常量数据和字符串都位于此处;
RW-data:表示已初始化的读写数据,程序中定义并且初始化的全局变量和静态变量位于此处;
ZI-data:表示未初始化的读写数据,程序中定义了但没有初始化的全局变量和静态变量位于此处;
下载到Flash程序大小: Code + RO-data + RW-data;
运行在SRAM的数据大小是: RW-data + ZI-data
在工程的编译文件夹里找到.map文件拉到最后可直接看程序大小
3-VSCode-GCC中计算Flash与SRAM大小的分布情况
- text段(Code segment/Text segment) -> Flash
代码段 存放程序执行的代码 在程序运行前大小就已经确定, 并且该区域属性通常为只读(某些架构也允许代码段可写, 即允许修改程序), 并且包含只读常量;
RO-Data + Code
- data段(Data Segment) -> SRAM
数据段, 通常存放程序中已初始化的全局变量的一块内存区域(初始化非0), 数据段属于静态内存分配
RW-Data
- bss段(Block Started by Symbol Segment) -> Flash
用来存放程序中未初始化(或初始化为0)的全局变量的一块区域, bss段属于静态内存分配
未手动初始化的数据(初始化非0), 并不应该给此段数据分配空间, 只是记录数据所需空间的大小, bss段的大小从可执行文件中
- 大小计算
RAM占用大小 = 堆区 + 栈区 + bss
Flash占用大小 = text + data