这篇文章是搜集了许多的帖子和资料,按照本人的理解写出来的。在文章末尾会将参考的帖子和资料标明,如果有什么错误和表达不当,希望读者能够指出。
简介:从内存角度,搞清楚C代码是怎样作用于单片机的。
问题:
- 了解单片机的内存,众所周知单片机是取指执行,那么单片机从哪里取指的?所执行的数据又放在在哪里?
- C代码是以什么样的形式进入到单片机内存中的?进入到了单片机内存的哪个位置?
- 从C编译器到单片机的执行,程序经历了怎样的变化。
- 在执行的过程中,内存中有怎样的变化?
目录
单片机内的存储区域
不同的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的最新技术,结构简单功耗低,很适合保存程序。
编译过程包括预处理、解析、优化,生成目标文件,
- 预处理阶段将删除注释、插入被#include指令包含的文件内容、定义和替换由#define指令定义的符号,以及确定代码的部分内容是否应该根据一些条件编译指令进行编译。
- 解析阶段检查语法,判断语义,生成汇编语言。
- 优化是为了让程序能够更加高效的运行,对目标代码进行进一步处理。
链接过程是将编译所生成的各个目标