C语言中有栈、堆、bss、data、code段。具体每个段具体是存储什么数据的,直接百度吧。重点分析一下STM32以及在MDK里面段的划分。
- Code存放在ROM
- RO-data存放在ROM
- RW-dat存放在RAM
- ZI-data存放在RAM
单片机初始化时RW-data从flash拷贝到RAM
生成的map文件位于list文件夹下 (KEIL)
- Total RO Size (Code + RO Data)
- Total RW Size (RW Data + ZI Data)
- Total ROM Size (Code + RO Data + RW Data)
Code:通常是指编译器生成的机器指令,也就是程序的执行代码,这些内容会被存储到ROM区。
RO-data:它指程序中用到的只读数据,因而程序不能被修改的内容,这些数据被存储在ROM区。 RO-data区典型:
例1、C语言中const关键字定义的变量。
例2、C语言中定义的全局常量。
例3、C语言中定义的字符串。
RW-data:即可读写数据区域,一定是初始化为“非0值”的可读写数据,而且应用程序可以修改其内容,这些数据被存储在RAM区
RW-data区典型:
例1、C语言中定义的全局变量,且初始化为“非0值”。
例2、C语言中定义的静态变量。且初始化为“非0值”。
ZI-data的栈空间 (Stack) 及堆空间 (Heap):编译器给出的 ZI-data 占用的空间值中包含了堆栈的大小 (经实际测试,若程序中完全没有使用 malloc 动态申请堆空间,编译器会优化,不把堆空间计算在内)。 可读写数据区域,一定是未初始化或初始化为“0值”的可读写数据,应用程序同样可以修改其内容,这些数据被存储在RAM区
ZI-data区典型:
例1、C语言中定义的数组,只定义了数组的大小,并没有给每个成员赋非0值。
以下数据节选于程序的.map文件结尾。
Code (inc. data) RO Data RW Data ZI Data Debug
26260 1882 312 236 36628 656971 Grand Totals
26260 1882 312 236 36628 656971 ELF Image Totals
26260 1882 312 236 0 0 ROM Totals
=========================================================================
Total RO Size (Code + RO Data) 26572 ( 25.95kB)
Total RW Size (RW Data + ZI Data) 36864 ( 36.00kB)
Total ROM Size (Code + RO Data + RW Data) 26808 ( 26.18kB)
=========================================================================
总结: 在拿到一款单片机的时候,一定要明确单片机的ROM大小和RAM大小。
ROM的最小空间一定要大于: Code + RO Data + RW Data的总和;
RAM的最小空间一定要大于: RW Data + ZI Data之和
注意:
ROM就是单片机的FLASH大小
RAM就是单片机的运行内存大小
以STM32G070为例,ROM = 128kB;RAM = 36kB
————————————————
参考链接:https://blog.csdn.net/zhai17863966493/article/details/125311733
Keil 中的Code, RO-data , RW-data, ZI-data - 扁桃体也发言 - 博客园
这篇文章也不错,可以看看文章来源:https://www.toymoban.com/news/detail-680165.html
http://t.csdn.cn/IdQ7Vhttp://t.csdn.cn/IdQ7V文章来源地址https://www.toymoban.com/news/detail-680165.html
到了这里,关于【STM32】Keil MDK 中的 Code、RO-data、RW-dat、ZI-data 是什么?分别放在哪里?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!