打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
STM32单片机程序的存储和执行

本期话题:

ARM单片机程序的存储和执行与PC程序存在很大差别,与ARM-A + Linux平台的程序也存在差别。
对于PC来说,可执行文件存储在磁盘上,当执行的时候,将文件内容(代码和数据)加载到内存中去执行。
而对于单片机来说,程序文件存在ROM中,执行的时候,指令代码不用加载到RAM即可执行。
今天,我们就来聊一聊ARM单片机程序存储和执行的相关内容。搞清楚这些,对我们日常开发将有很大的帮助。
聊一聊:
一般MCU包含的存储空间有:片内Flash和片内RAM。其中,Flash存储的数据在系统掉电后也能正常保存;存放在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单片机程序的存储和执行,到此就介绍完毕了,希望这篇文章能对大家有所帮助。
来源:一起学嵌入式
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
一篇文章讲透单片机的RAM和FLASH
【MCU】一种单片机节省内存的方法(补充)
在51单片机上跑RTOS有没有意义?
STM32 Keil查看程序占用ROM和RAM
MCU内存分配
单片机的ROM与RAM
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服