先说说MDK编译好后的显示的。
上图第三行是烧写到FLASH的大小,第二行(可修改的数据)是占用SRAM的大小
1、stm32一开始上电的时候,按理来说是从0x0000 0000开始读取第一条指令的,但M3系列的不同,通过boot0,boot1上电状态的不同,进入不同的工作模式,取得第一条指令的地址也就不同了。
- 通过boot引脚设置可以将中断向量表定位于SRAM区,即起始地址为0x2000000,同时复位后PC指针位于0x2000000处;
- 通过boot引脚设置可以将中断向量表定位于FLASH区,即起始地址为0x8000000,同时复位后PC指针位于0x8000000处;
- 通过boot引脚设置可以将中断向量表定位于内置Bootloader区,本文不对这种情况做论述;
(当然,上述地址也是可以更改的)
同时,stm32内部的该寄存器记录了,向量表偏移量的值
2、0x08000000(代码区)的一开始位置有一张中断向量表,其第一个表项是栈顶地址,第二个表项是复位中断服务入口地址。
程序会先取出0x08000000的值,给sp寄存器。
再接着取0x08000004的值(即复位中断程序),给pc寄存器,去执行它
如图,sp=0x20000690 pc=80001101
我们可以从生成的******.map文件中看到
pc指向的位置就是复位中断服务的入口,进入之后,时钟初始化,然后跳转__main函数,最后进入mian函数,来到C的世界
3、那么sp的值大小有时怎么算出来的呢
就是根据最上面RW SIZE的数值大小,加上MDK里设置的0x20000000的初始值,得出的
但其实,有时候会发现自己写的程序(初始化的全局变量,静态变量之类)并没有占有这么大的空间。那RW SIZE的数值大小有时哪来的呢
上图为.map文件里的内容
看得出只有.data和.bss才是用户自己添加的代码占用空间大小
其他的HEAP,STACK都是别文件里添加上的,比如启动文件