本期话题
聊一聊
一般 MCU 包含的存储空间有:片内Flash和片内RAM。Flas存储的数据在系统掉电后也能正常保存;存放在RAM中的数据掉电后丢失 。
本文的 MCU 以 stm32 为例。MDK编译完成后生成的程序文件包括以下部分内容:
Code:代码段,存放程序的代码部分;
RO-data:只读数据段,存放程序中定义的常量;
RW-data:读写数据段,存放初始化为非 0 值的全局变量;
ZI-data:0 数据段,存放未初始化的全局变量及初始化为 0 的变量;
编译完成之后,会生成一个 .map 文件,该文件说明了各个函数占用的空间大小和地址。在文件最后会说明各个字段的关系和大小:
最终生成的文件大小为各个部分的总和:Code+RO Data+RW DATA 三部分,ZI Data 不占用文件空间,即可执行文件不包含ZI Data。
这个文件一般是 bin 或者是 hex 文件,它被烧录进 MCU 的片内Flash中。
当MCU启动之后,stm32启动文件将 RW 段中的变量复制到片内 RAM中,同时初始化 ZI Data 所在的 RAM空间。
MCU 内部的Flash 是可以直接运行代码的(通过 XIP 技术),也就是说,可执行文件的 Code 和 RO Data不会被加载到 RAM中。
这就涉及到程序的存储状态了,应用程序具有静止状态和运行状态。静止态的程序被存储在非易失存储器中,如 STM32 的内部 FLASH,因而系统掉电后也能正常保存。
但是当程序在运行状态的时候,程序常常需要修改一些暂存数据,由于运行速度的要求,这些数据往往存放在内存中(RAM),掉电后这些数据会丢失。因此,程序在静止与运行 的时候它在存储器中的表现是不一样的。
图中的左侧是应用程序的存储状态,右侧是运行状态,而上方是 RAM 存储器区域,下方是 ROM 存储器区域。
程序在存储状态时, RO 节(RO section)及 RW 节都被保存在 ROM 区。
当程序开始运行时,内核直接从 ROM 中读取代码,并且在执行主体代码前,会先执行一段加载代码,它把 RW 节数据从 ROM 复制到 RAM,并且在 RAM加入 ZI 节,ZI 节的数据都被初始化为 0。加载完后 RAM 区准备完毕,正式开始执行主体程序。
好了,关于STM32单片机程序的存储和执行就介绍完毕了。
感谢阅读,加油~
觉得文章不错,点击“分享”、“赞”、“在看” 呗!