STM32的内存分配情况

建立好一个keil工程后,经过编译可看到芯片内存占用情况在这里插入图片描述
其中 RW_data+ZI_data=19000字节,也就是0x4A38,表示程序中数据占用内存的字节数,包括堆栈。
程序占用flash空间的大小:Code+RO_data
运行时程序占用RAM空间的大小:RW_data+ZI_data
烧写程序时占用flash空间的大小:Code+RO_data+RW_data,这也是image文件包含的三个内容
ZI数据全部为零,在程序运行前清零,不需要存储在flash中,以节省空间。
程序复位后的MSP指向的是0x20004A38(即在flash的起始地址0x08000000处保存的数据是0x20004A38)。
在这里插入图片描述
那么在RAM中低于0x20004A38地址的内容都是些什么呢?这个可以从map文件里看到:
在这里插入图片描述
由此可见,编译器把各源文件中的数据分类安排在RAM里的固定地址,分为.data段(已初始化成非0的那些全局和静态变量)、.bss段(Block Started by Symbol segment 未初始化的全局和静态变量,编译器最终会将其初始化为零作为ZI段?)以及STACK堆栈(函数局部变量、函数参数、上下文切换等)。而最后一行显示STACK的基址为0x20004638,跟栈顶地址0x20004A38正好差0x400,这个0x400正好是在s文件中定义的堆栈大小:
在这里插入图片描述
所以0x20004638其实是栈底的地址,而栈顶地址是0x20004A38,这就验证了STM32的堆栈增长方向是向下增长,即从高地址向低地址增长。另外,紧挨着STACK的低地址区是堆区,堆的增长方向正好与栈相反。启动文件中的__initial_sp是一个标号,即栈的栈顶地址。
在这里插入图片描述
STM32上电后根据boot引脚启动系统,默认从内部flash启动,启动之后搬运rw-data到RAM中,但不会搬运code,也就是说STM32执行代码是在flash中读取,数据从RAM中读取。这点与X86的PC机不同,PC机在启动后会把硬盘中的code搬运到内存RAM中,再从RAM中读取程序和数据。一些高性能的CPU会与X86的启动机制一样,比如TI的Davince系列。

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值