上一章节讲到MDK编译程序后,会告诉你program size,其中有Code、RO-data、 RW-data、 ZI-data的大小的说明。
这里的说明的意思是主要是告诉你,此时你编写的工程:FALSH和SRAM的资源的使用状况。
我们可以打开map文件查看,此文件一般在OBJ文件夹中找到,不知道怎么查看和看的可以看我的上一篇文章里面的第一个链接。

program size的意思就是告诉你消耗的资源。那么这些变量究竟是存放在内存的什么位置呢?
笔者做了下面的测试,用于查看变量的存储地址。

如下所示,声明了2个全局数组,2个全局变量。
关于stm32的Code、RO-data、 RW-data、 ZI-data的测试(二)
在main函数里面打印上述变量的地址。
关于stm32的Code、RO-data、 RW-data、 ZI-data的测试(二)

下载到stm32单片机后,使用串口打印出来的信息。
关于stm32的Code、RO-data、 RW-data、 ZI-data的测试(二)
这时候发现,全局变量的存储分配的顺序为:
(1)已初始的全局数组
(2)已初始化的全局变量
(3)未初始化的全局变量
(4)未初始化的全局数组

接着查看map文件!
关于stm32的Code、RO-data、 RW-data、 ZI-data的测试(二)
此时查看map文件,再经过一些测试,主要是增大或者改小对应的变量的大小。来找到map文件中变化的数据。
从而确定,全局变量在实际SRAM中的分配的位置和顺序。

一、——.data段
起始地址:0x2000 0000
结束地址:0x2000 0000 +已经初始化的全局数组的大小+已经初始化的全局变量的大小+未初始化的全局变量的大小
存储的内容为:已经初始化的全局数组,已经初始化的全局变量,未初始化的全局变量

二、——.bss段
起始地址:.data的结束地址(x字节对齐)
结束地址:.bss段起始地址 +未初始化的全局数组的大小
存储的内容为:未初始化的全局数组

三、——HEAP(堆区)
起始地址:.bss段结束地址(x字节对齐)
结束地址:HEAP起始地址+启动文件里,声明的堆的大小(上述测试该处大小为0)

三、——STACK(栈区)
起始地址:HEAP结束地址(x字节对齐)
结束地址:STACK起始地址+启动文件里,声明的栈的大小(上述测试该处大小为0x400)

总结:本文主要讲述了
RW-data、 ZI-data空间具体在SRAM中存储的对应。

结论:
RW-data的大小 = 已经初始化的全局数组大小+已经初始化的全局变量大小+未初始化的全局变量的大小
RW-data存储在SRAM中的.data 段

ZI-data的大小= 未初始化的全局数组的大小+堆大小+栈的大小
ZI-data被分别存储在SRAM中的.bss段,堆段和栈段

下集预告:
我们知道,代码和字符串常量都是保存在FLASH里面的。
打开启动文件中,从上往下翻阅,可以看到此处有关于中断向量的地址声明
关于stm32的Code、RO-data、 RW-data、 ZI-data的测试(二)
那么这个中断向量到底是存放在哪里的呢?

相关文章: