上一章节讲到MDK编译程序后,会告诉你program size,其中有Code、RO-data、 RW-data、 ZI-data的大小的说明。
这里的说明的意思是主要是告诉你,此时你编写的工程:FALSH和SRAM的资源的使用状况。
我们可以打开map文件查看,此文件一般在OBJ文件夹中找到,不知道怎么查看和看的可以看我的上一篇文章里面的第一个链接。
program size的意思就是告诉你消耗的资源。那么这些变量究竟是存放在内存的什么位置呢?
笔者做了下面的测试,用于查看变量的存储地址。
如下所示,声明了2个全局数组,2个全局变量。
在main函数里面打印上述变量的地址。
下载到stm32单片机后,使用串口打印出来的信息。
这时候发现,全局变量的存储分配的顺序为:
(1)已初始的全局数组
(2)已初始化的全局变量
(3)未初始化的全局变量
(4)未初始化的全局数组
接着查看map文件!
此时查看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里面的。
打开启动文件中,从上往下翻阅,可以看到此处有关于中断向量的地址声明
那么这个中断向量到底是存放在哪里的呢?