祝各位道友念头通达
GitHub Gitee 语雀 打赏

针对单片机flash和ram的分析(stm32)

单片机型号(STM32H750IBKx) STM32H 系列

问题描述:

  1. 在裸机开发中, 当代码量越来越大的时候,生成的需要烧写的二进制文件也越来越大, 片内的flash之后128KB,超过这个数之后下载到flash中可能就会出错
  2. 代码量大的同时,运行的时候, CPU将固件读到RAM,然后文件的大小如果超出了RAM的大小, 程序运行也会出错

主要搞明白:
1. 如何查看片内flash和ram大小
2. 代码编译运行时对代码中的一些变量和方法如何存储,运行时如何开辟内存空间
3. 生成的各种二进制文件的区别(.hex, .bin, .axf)以及烧写方式

如何查看片内flash和ram大小

  1. 官方文档和手册:
    image
    根据官方文档给出的 FLASH 的大小为 128KB, SRAM 大小为 1024KB
  2. 通过芯片手册查看在文档一列中, datasheet查看
    image

对RAM的描述

对ram的分类和大小说明特别明确:
ITCM: 专用于指令传输的总线, 对时间要求特别严格的代码,可以放在 ITCM中执行, 有效的提高运行速度
DTCM: 专用于数据传输的总线, 对反复需要操做的数据可以放在 DTCM中执行
ITCM和DTCM是直连CPU的,比读写片上RAM要快,可以达到 CPU Cache 的速度(ICache缓存指令, DCache缓存数据),这个主要针对sram
image

对flash的描述

对flash的描述很模糊, 在stm32程序中都是有自举程序的,一般大小占用就有 128KB
image
在STM32H7系列当中对flash的描述是这样子
image
STM32H7系列当中, flash用户大小是2MB, 另外128*2作为系统的本身flash程序, 而我们自己的程序在flash当中一般是以最低地址开启计算的 0x08000000:
image

生成的各种二进制文件的区别(.hex, .bin, .axf, .elf)以及烧写方式

首先,在编译完代码之后,在编译文件的目录下有 .map文件,其中包含了数据的大小

Code(inc .data):代码数据
RO-data:指只读数据,除了内联数据之外的常量数据,短字符串等,存在flash中
RW-data:指可读写、已初始化的变量数据,存在flash中,运行时会去读到arm当中
ZI-data:指未初始化的变量数据,运行时在ram当中
Debug :显示调试数据占用了多少字节,例如,调试输入节以及符号和字符串。
Object Totals :显示链接到一起以生成映像的对象占用了多少字节。
(incl. Generated):链接器会生成的映像内容,例如,交互操作中间代码。 如果 Object Totals 行包含此类型的数据,则会显示在该行中。本例中共有 1016 字节的 RO 数据,其中32字节是链接器生成的 RO 数据。
(incl. Padding) :链接器根据需要插入填充,以强制字节对齐。
1、Code、Ro-data:位于FLASH中;
2、RW-data、ZI-data:位于RAM中;
3、RW-data已初始化的数据会存储在Flash中,上电会从FLASH搬移至RAM;
4、Total ROM Size 就是下载到flash中的程序大小,就是生成.bin的大小

文件hex bin axf elf区别
需要注意的时 axf 和 elf 文件都包含了最终只烧写到flash上实际文件大小, 比如在keil调试烧写的是 .axf, 这里面一般包含了调试信息, 文件比较大(5MB), 而下载到flash中,并不是直接把axf文件写进去,而是把axf中包含的 .bin(Code + RO Data + RW Data,大约40KB, .map文件中有详细的说明) 烧写进去

.bin和.hex 如何生成

https://www.cnblogs.com/han-guang-xue/p/16525292.html

烧写方式

.bin.hex : 使用jlink, https://blog.csdn.net/weixin_45612967/article/details/102818623

.elf.axf:烧写:直接使用keil,这个属于可调式的文件

posted @ 2022-12-13 18:30  韩若明瞳  阅读(1143)  评论(0编辑  收藏  举报