CODE、RO、ZIDATA区分


  • Code:即代码域,它指的是编译器生成的机器指令,存储在FLASH中。

  • RO-data:Read Only data,即只读数据域,它指程序中用到的只读数据,存储在FLASH中,因而程序不能修改其内容。例如C语言中const关键字定义的变量就是典型的RO-data。

  • RW-data:Read Write data,即可读写数据域,已经被初始化的全局变量或静态变量(类似于Linux C程序中的DATA段);存储在FLASH中。初始化时RW-data从flash拷贝到SRAM,

  • ZI-data:Zero Initialie data,未初始化的可读写全局或静态变量(类似于Linux C程序中的BBS段,程序加载时该区域数据会被初始化为0);存储在SRAM中。ZI-data不会被算做代码里因为不会被初始化。栈空间(Stack)和堆空间(Heap)均属于ZI-data空间


RW-data和ZI-data它们仅仅是初始值不一样而已,为什么编译器非要把它们区分开?这就涉及到程序的存储状态了,应用程序具有静止状态和运行状态。静止态的程序被存储在非易失存储器中,如STM32的内部FLASH,因而系统掉电后也能正常保存。但是当程序在运行状态的时候,程序常常需要修改一些暂存数据,由于运行速度的要求,这些数据往往存放在内存中(RAM),掉电后这些数据会丢失。因此,程序在静止与运行的时候它在存储器中的表现是不一样的。

简单的说就是在烧写的时候是FLASH中的被占用的空间为:Code+RO Data+RW Data
程序运行的时候,芯片内部RAM使用的空间为: RW Data + ZI Data
程序运行的时候,只读区域(RO):Code+RO Data
【CODE、RO、ZIDATA区分】CODE、RO、ZIDATA区分
文章图片





    推荐阅读