技术热线: 0755-86643915

单片机开发

以CS32F03x芯片为例,浅谈ARM单片机程序的存储和执行

更新时间: 2023-07-27 14:42:27
阅读量:
ARM单片机程序的存储和执行与PC程序存在很大差别,与ARM-A + Linux平台的程序也存在差别。 对于PC来说,可执行文件存储在磁盘上,当执行的时候,将文件内容(代码和数据)加载到内存中去执行。 而对于单片机来说,程序文件存在ROM中,执行的时候,指令代码不用加载到RAM即可执行。 今天,我们就来聊一聊ARM单片机程序存储和执行的相关内容。搞清楚这些,对我们日常开发将有很大的帮助。 聊一聊: 一般MCU包含的存储空间有:片内Flash和片内RAM。其中,Flash存储的数据在系统掉电后也能正常保存;存放在RAM中的数据掉电后丢失。 本文的MCU以CS32F03x为例,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启动之后,CS32F03X启动文件将RW段中的变量复制到片内RAM中,同时初始化ZI Data所在的RAM空间。 MCU内部的Flash是可以直接运行代码的(通过XIP技术),也就是说,可执行文件的Code和RO Data不会被加载到RAM中。 这就涉及到程序的存储状态了,应用程序具有静止状态和运行状态。静止态的程序被存储在非易失存储器中,如CS32F03X的内部Flash,因而系统掉电后也能正常保存。 但是当程序在运行状态的时候,程序常常需要修改一些暂存数据,由于运行速度的要求,这些数据往往存放在内存中(RAM),掉电后这些数据会丢失。因此,程序在静止与运行的时候它在存储器中的表现是不一样的。

左侧是应用程序的存储状态,右侧是运行状态,而上方是RAM存储器区域,下方是ROM存储器区域。 程序在存储状态时,RO节(RO section)及RW节都被保存在ROM区。 当程序开始运行时,内核直接从ROM中读取代码,并且在执行主体代码前,会先执行一段加载代码,它把RW节数据从ROM复制到RAM,并且在RAM加入ZI节,ZI节的数据都被初始化为0。加载完后RAM区准备完毕,正式开始执行主体程序。 好了,关于CS32F03x单片机程序的存储和执行,到此就介绍完毕了,希望这篇文章能对大家有所帮助。

(文转网络,侵删)