使用MounRiver Studio(MRS)这款集成开发环境(IDE)对RISC-V MCU进行嵌入式开发时,工程师不用关注RISC-V MCU 繁杂的底层编译过程,只需用C语言编写相应的工程代码,点击build编译按钮,即可生成hex或bin目标文件,下载后即可运行。 本文将分析点击bulid按键后,.c文件是如何一步一步变为可执行的.hex或.bin文件。 2、编译过程而将.C文件转变为最终的.hex或.bin目标文件,需要经过预处理、编译、汇编、链接这四个步骤。 2.1 预处理(Pre-Processing)主要包括宏定义(#define),文件包含(#include),条件编译(#ifdef)三部分。 预处理期间将检查包含预处理指令的语句和宏定义,并对其进行响应和替换,并删除程序中的注释和多余空白字符,最后会生成 .i 文件。 2.2 编译(Compiling)编译器会将预处理完的 .i 文件进行一些列的语法分析,并优化后生成对应的汇编代码,生成 .s 文件。 RISC-V MCU的工程采用GCC编译,官方工具链地址:https://github.com/riscv/riscv-gnu-toolchain。 当然,各厂家会根据自家的内核设计,修改对应的工具链以支持其特色功能,如沁恒微电子的RISC-V MCU所特有的HPE硬件压栈和VTF免表中断技术,需要在中断服务函数增加指令 __attribute__((interrupt("WCH-Interrupt-fast"))),然后在编译时会识别并省略软件压栈的过程。 2.3 汇编(Assembling)通过汇编器将编译器生成的 .s 汇编程序汇编为机器语言或指令,也就是可以机器可以执行的二进制程序,生成 .o 文件。 2.4 链接(Linking)根据“*.ld”链接文件将多个目标文件(.o)和库文件(.a)输入文件链接成一个可执行输出文件(.elf)。涉及到对空间和地址的分配以及符号解析与重定位。 3、elf、hex、bin文件说明使用MRS编译时,最终生成的可执行文件为elf、hex或bin文件,这些文件之间的联系如下: 3.1 elf文件ELF(Executable and Linkable Format),可执行与可链接格式。 elf是一种用于二进制文件、可执行文件、目标代码、共享库和核心转储格式文件。是UNIX系统实验室(USL)作为应用程序二进制接口(Application Binary Interface,ABI)而开发和发布的,也是Linux的主要可执行文件格式。ELF文件记录的信息更多、更复杂。主要包含以下内容:
格式如下: 行开始数据长度地址数据类型数据校验 :BBAAAATTD……DCC 1字节2字节1字节n字节1字节
3.3 bin文件bin是binary的缩写,即二进制文件,全是0或1的文件,最底层的可执行的机器码。只包含程序数据。bin文件的大小直接反应所占flash内存的大小。 3.4 转换关系因为bin、hex都是只是记录数据的,但elf类型不仅记录数据还有程序描述,所以elf文件通过gcc中的objcopy可转换成hex或bin文件,hex文件也可转换成bin文件,但反之不可。 3.5 总结bin文件最小最简单,但是安全性差,功能性差,hex包含头尾和检验,就有很好的安全性,但是文件比bin大,功能没有elf强大;elf功能多,但是文件最大。 在使用工程编译结果是,最好有bin或者hex同时具有elf文件,elf用于仿真和调试,但输出的到工厂的文件可以使用hex和bin。 |
扫一扫,分享给好友
电子发烧友网
电子发烧友开云(中国)官方