C程序载入内存的过程

本文详细介绍了C程序如何从源代码变成可执行文件,并加载到单片机的FLASH和SRAM中。C代码经编译、链接后成为可执行程序,保存在FLASH的Code区域。上电时,数据从FLASH拷贝到SRAM,其中已初始化的全局变量存于.data段,未初始化的变量位于.bss段。运行时,程序在SRAM中执行,保证执行效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这篇文章是搜集了许多的帖子和资料,按照本人的理解写出来的。在文章末尾会将参考的帖子和资料标明,如果有什么错误和表达不当,希望读者能够指出。

简介:从内存角度,搞清楚C代码是怎样作用于单片机的。

问题:

  • 了解单片机的内存,众所周知单片机是取指执行,那么单片机从哪里取指的?所执行的数据又放在在哪里?
  • C代码是以什么样的形式进入到单片机内存中的?进入到了单片机内存的哪个位置?
  • 从C编译器到单片机的执行,程序经历了怎样的变化。
  • 在执行的过程中,内存中有怎样的变化?

目录

单片机内的存储区域

C程序 -> 可执行文件

单片机下载程序,保存到内存中

单片机运行过程中FLASH和SRAM的变化


单片机内的存储区域

不同的MCU的内核不同,所对应的RAM和ROM区域也不相同,存放代码和数据的方式也有所区别。在这里仅以Cortex-M4的参考手册为例,简单介绍一下单片机内部的存储机制。

下图是Cortex-M4内核的地址映射,注意到图中标红的Code和SRAM两个区域。这两个区域是单片机下载代码和数据后存放的位置。

Code以0x00000000开始的一片ROM(FLASH)区域,SRAM是以0x20000000开始的一片RAM区域,SRAM的读取速度相比于Code更快,用来保留堆栈和数据,保证CPU的执行效率。

这里要注意,Code是从0x00000000开始,但是我们的代码是从0x08000000开始,因为前面由厂家配置,boot程序之类的东西。

C程序 -> 可执行文件

单片机能够直接执行机器码,也就是可执行文件。C程序经过编译链接之后获得可执行文件。

C代码经过编译、链接之后成为可执行文件。之后装入单片机的FLASH中,由单片机执行可执行文件。

这里的FLASH指的就是Code区域,FLASH是ROM的最新技术,结构简单功耗低,很适合保存程序。

 

编译过程包括预处理、解析、优化,生成目标文件,

  1. 预处理阶段删除注释插入被#include指令包含的文件内容定义和替换由#define指令定义的符号,以及确定代码的部分内容是否应该根据一些条件编译指令进行编译。
  2. 解析阶段检查语法,判断语义,生成汇编语言。
  3. 优化是为了让程序能够更加高效的运行,对目标代码进行进一步处理。

链接过程是将编译所生成的各个目标

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值