编译过程
- 预处理(Preprocessing):预处理用于将所有的#include头文件以及宏定义替换成其真正的内容,gcc的预处理是预处理器cpp来完成的(.i)
- 编译(Compilation):将经过预处理之后的程序转换成特定汇编代码(assembly code)的过程(.s)
- 汇编(Assemble):将上一步的汇编代码转换成机器码(machine code),这一步产生的文件叫做目标文件,是二进制格式。gcc汇编过程通过as命令完成。这一步会为每一个源文件产生一个目标文件(.o)
- 链接(Linking):链接过程将多个目标文以及所需的库文件(.so等)链接成最终的可执行文件(executable file)(.out)
CMake,Makefile,GCC
GCC、CMake、CMakelist、Make、Makefile、Ninja啥关系?一图讲透!
- GCC需要逐文件编译 -> 利用Make & Makefile批量编译
- Makefile有不同平台,格式标准多样 -> 利用CMake自动生成对应平台的Makefile
- CMake编译慢 -> Ninja快速编译
总而言之CMake和Makefile都是类似于脚本的存在,方便自动化编译复杂的、多平台的工程
程序烧录
- 烧录方式演变:编程器离线编程(要取出芯片)-> ISP(系统在线编程)。ISP就是通过电脑端的上位机软件,通过某种数据传输协议,将程序编译产生的二进制文件烧录到单片机的EEPROM中
- 烧录数据传输方式:串口、SPI、SWD接口、JTAG接口
- 特殊:串口协议是靠芯片内部已固化的一段闭源引导程序(BootLoader)来写入Flash
- BootLoader在系统存储区(低地址先执行)。故在程序启动时,串口方式应从系统区启动(需要引导程序),其他方式应从用户区启动(无需引导程序)。主闪存存储器即用户区Flash
- ISP & ICP & IAP:
- ICP(In Circuit Programming)与ISP(In System Programming)概念类似
- IAP(In Application Programming):在程序运行过程中改变代码(用于远程在线更新固件)
仿真、调试、烧录
- 调试好的程序一般下载到芯片FLASH上的,而调试一般下载到芯片的RAM上(掉电后会清除)
- 目前ST-Link、J-Link等仿真器实际上不执行程序,只负责加载程序、调试和控制程序运行、以及提供调试接口。程序是在板上的芯片上运行的(GPT4)