MCU内存占用

MCU中几个常用的段类型如下:

Section R/W 描述
.data RW 带有初值的静态或全局变量
.rodata RO 只读变量
.bss RW 没有初值或初值为0的静态或全局变量。该段也称为.zi(Zero Initialized)
.text RO 代码段。该段也称为.code

.data和.bss段称为readwrite data,.rodata段称为readonly data, .text段称为readonly code。

在IAR平台下,工程编译后生成的.map文件中包含这几项的使用情况,如下:

  3 252 bytes of readonly  code memory
    106 bytes of readonly  data memory
  1 357 bytes of readwrite data memory

设置项目的输出文件格式为bin文件,观察bin文件的大小:

Bin File Size

可以看到Bin文件的大小恰好等于上述前两项之和。

Bin文件仅包含数据内容,相当于Flash,于是得到如下结论:

Used Flash = readonly code memory + readonly data memory
Used RAM   = readwrite data memory

疑问

ARM的映像文件包含了.rodata, .text和.data几个段的数据,为什么在这里bin文件大小却等于.rodata和.text两项的和呢?

4 thoughts on “MCU内存占用”

  1. ARM的镜像文件是指ARM RAM空间跟NVRAM空间的文件么?bin文件是下载到NVRAM空间,所以只包含.text代码段跟.rodata常量数据段(const 申明的数据); .data的变量应该包含在代码中,MCU启动后从NVRAM load到RAM空间。

    Reply
    • 镜像文件好像是arm规范里面的术语,我理解就是bin文件。.data报告在bin内这个点,好像网上都这么说,我也有些不解。

      Reply
  2. .text是对应gcc代码段,保存在ROM中。.rodata对应gcc中的data数据段(Ro-data const关键字修饰,RW-data 初始化非0可读写数据),也是要保存在ROM中。.data对应gcc的bss段,初始化为0的数据,运行时在RAM里,栈空间。所以bin文件是.text+.rodata。

    Reply

Leave a Comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.