参考资料:
1.狄泰软件学院的C语言教程
2.《armlink_user_guide》、《ARM® Developer Suite Compilers and Libraries Guide》、《ARM® Developer Suite Linker and Utilities Guide》
3.https://blog.csdn.net/xingqingly/article/details/120260398
4.https://blog.csdn.net/weixin_42328389/article/details/120622384
5.https://blog.csdn.net/weixin_43624808/article/details/87007392
本文主要回答之前的疑问:关于STM32选型时需要注意的参数Flash和RAM大小
程序有两个状态
1.可执行文件,属于静态概念,这种情况下,程序处于ROM中;
2.正在执行的程序,属于动态概念,这种情况下,会将静态程序中的部分内容加载到RAM中。
上述两个状态,在ARM中称作Load view和Execution view。
Load view下:只是用ROM中,静态程序由RO section和RW section组成
Execution view:使用了RAM和ROM,其中ROM中的内容不变,静态程序的RW section要加载到RAM中,并同时会引入ZI section.
Load view称作加载域,Execution view称作运行域。加载域就是程序在Flash中的实际存储,而运行域是芯片上电后的运行状态。
下面对RO section、RW section和ZI section做相关阐述:
RO section:由.text段和.constdata段(.rodata段)组成;
RW section:由.data段组成
ZI section:由.bss段、栈、堆组成
.bss段:存放未初始化的全局变量和静态变量
.text段:存放程序中的可执行代码
.data段:存放初始化的全局变量和静态变量
.constdata段(.rodata段):存放程序中的常量值
栈:存放程序临时创建的局部变量,由系统自动分配和释放
堆:用于内存的动态申请和归还
所以程序所需的Flash和RAM大小的计算公式为
Flash = RO section + RW section = .text段 + .constdata段 + .data段
RAM = RW section + ZI section = .data段 + .bss段 + 栈 + 堆
后续待增加的内容:
栈:栈是向下生长的。当有变量入栈,栈顶指针的值减小;
栈在程序中,用于维护函数调用的上下文
堆:堆是向上生长的。先申请的堆变量,存储在低地址单元。
堆主要用于内存的动态申请和归还。
标签:RW,变量,静态,section,RAM,程序,内存,分配,view From: https://www.cnblogs.com/xing-2/p/17112476.html