STM32--Code、RO-data、RW-data和ZI-data

MDK编译程序的组成:
    Code:代码域,它指的是编译器生成的机器指令,这些内容被存储到ROM区。
    RO-data: Read Only data,只读数据域,它指程序中用到的只读数据,这些数据被存储在ROM区,因而程序不能修改其内容。C语言中const关键字定义的变量就是典型的RO-data。
    RW-data: Read Write data,可读写数据域,它指初始化为“非0值”的可读写数据,程序刚运行时,这些数据具有非0的初始值,且运行的时候它们会常驻在RAM区,因而应用程序可以修改其内容。C语言中定义的全局变量,且定义时赋予“非0值”给该变量进行初始化。
    ZI-data: Zero Initialie data,即0初始化数据,它指初始化为“0值”的可读写数据域。它与RW-data的区别是程序刚运行时这些数据初始值全都为 0,而后续运行过程与RW-data的性质一样,它们也常驻在RAM区,因而应用程序可以更改其内容。例如C语言中使用定义的全局变量,且定义时赋予“ 0 值”给该变量进行初始化(若定义该变量时没有赋予初始值,编译器会把它当ZI-data来对待,初始化为 0);
    ZI-data 的栈空间(Stack)及堆空间(Heap):在C语言中,函数内部定义的局部变量属于栈空间,进入函数的时候会向栈空间申请内存给局部变量,退出时释放局部变量,归还内存空间。而使用malloc动态分配的变量属于堆空间。在程序中的栈空间和堆空间都是属于ZI-data区域的,这些空间都会被初始值化为0值。编译器给出的ZI-data占用的空间值中包含了堆栈的大小(经实际测试,若程序中完全没有使用malloc动态申请堆空间,编译器会优化,不把堆空间计算在内)。
    程序组件所属的区域:
    程序组件                  所属类别
    机器代码指令              Code
    常量                      RO-data
    初值非0的全局变量         RW-data
    初值为0的全局变量         ZI-data
    局部变量                  ZI-data栈空间
    使用malloc动态分配的空间  ZI-data堆空间
    RW-data 和 ZI-data 它们仅仅是初始值不一样而已,应用程序具有静止状态和运行状态。静止态的程序被存储在非易失存储器中,如 STM32 的内部 FLASH,因而系统掉电后也能正常保存但是当程序在运行状态的时候,程序常常需要修改一些暂存数据,由于运行速度的要求,这些数据往往存放在内存中(RAM),掉电后这些数据会丢失。因此,程序在静止与运行的时候它在存储器中的表现是不一样的,
    程序状态区域的组成;
    程序状态与区域                 组成
    程序执行时的只读区域(RO)       Code+RO-data
    程序执行时的可读写区域(RW)     RW-data + ZI-data
    程序存储时占用的ROM区          Code + RO-data + RW-data
    参考资料:零死角玩转STM32

你可能感兴趣的:(嵌入式)