以Cortex-M3 SoC芯片的hello_world软件仿真为例:

我们先以keil编译结果为例说明,gcc的编译另文讲。

放大看:
Program Size: Code=664 RO-data=224 RW-data=8 ZI-data=864
② RO DATA为只读数据;
③ RW DATA为非0初始化的全局和静态变量,需从flash搬运到sram;
④ ZI DATA(zero initialize)为0初始化的内存区的大小(包含0初始化的全局和静态变量+堆区+栈区)。
简单的说,程序运行时,芯片FLASH占用的空间为:Code + RO Data + RW Data,芯片RAM 占用的空间为:RW Data + ZI Data;打开hex文件,看一下前四个字节0x2000_0368。
很惊喜,hex文件的前4个字节为主堆栈指针MSP的初值。
主堆栈指针大小:
0x2000_0368 – 0x2000_0000(SRAM起始地址)
= 0x368(十进制872),
刚好是 RW-data(8) + ZI-data(864) = 872 的大小。 这就解释了MSP主堆栈指针是怎么产生的疑惑了。同时,也证明了RAM的大小确实=RW+ZI的大小。
但是用keil编译时,keil并不是按RAM的最高地址生成的HEX前4字节(也即MSP的初值),而是按照:
全局和静态变量的容量+Heap_Size+Stack_Size三者之和,作为HEX文件的前4字节。



感谢阅读文章,如果文章有用,麻烦点个“在看”或转发分享。

转载:全栈芯片工程师
免责声明:文章内容来自互联网,本站不对其真实性负责,也不承担任何法律责任,如有侵权等情况,请与本站联系删除。
转载请注明出处:【MCU】Cortex-M3 SoC的主栈指针-mcucont https://www.yhzz.com.cn/a/10498.html