IMX6ULL嵌入式烧录文件的总结

本文档总结了IMX6ULL嵌入式系统中常用的烧录文件类型及其用途,帮助开发者更好地理解和使用这些文件进行系统烧录和调试。

1. 一共有哪些文件,都是什么用途

在vscode软件中,我们打开一个可以运行的工程,发现有很多不一样的格式文件,但是不知道都是些什么用途,看着很头大,那就跟着这篇文章来理清楚这些文件和用途吧。
随便打开一个文件夹,我们可以看到下面这些文件(基于BSP工程管理的):
在这里插入图片描述

这整个个文件夹下主要包含以下几个重要的文件和文件夹:

  1. .vscode文件夹下的c_cpp_properties.json(用于配置vscode的C/C++编译环境)
  2. imx6ul文件夹(存放芯片相关驱动代码和配置文件)
  3. bsp文件夹 (存放外设驱动代码和配置文件)
  4. project文件夹 (存放主函数.c和.s文件)
  5. .lds文件(链接脚本文件,定义内存布局)
  6. Makefile文件(用于控制编译过程)
  7. obj文件夹(存放编译生成的中间文件.o文件)
  8. .elf文件(可执行文件,包含调试信息)
  9. .bin文件(存放最终生成的可执行文件)
  10. .dis文件(反汇编文件,查看汇编代码)
  11. .imx文件(用于烧录的镜像文件)
  12. imxdownload软件(用于烧录程序到芯片)

要搞懂嵌入式开发中.s/.c→.o→.elf→.bin→.imx的编译烧录链路,整个过程分为编译、链接、镜像转换、烧录四大阶段,每一步的输入 / 输出、工具、目的都清晰可追溯:
.s/.c(源码)
↓ 编译(arm-linux-gcc)
.o(目标文件)
↓ 链接(ld,配合.lds链接脚本)
.elf(可执行文件,带地址/调试信息)
↓ 提取纯二进制(objcopy)
.bin(裸二进制数据)
↓ 加i.MX启动头部(mkimage/elftosb)
.imx(i.MX专属启动镜像)
↓ 烧录(imxdownload软件)
SD卡/EMMC/Flash(芯片可启动)

下面文章的整个流程细节如下:

前期准备文件
.vscode文件夹下的c_cpp_properties.json(用于配置vscode的C/C++编译环境)
imx6ul文件夹(存放芯片相关驱动代码和配置文件)
bsp文件夹 (存放外设驱动代码和配置文件)
project文件夹 (存放主函数.c和.s文件)

编译+链接相关文件
.lds文件(链接脚本文件,定义内存布局)
Makefile文件(用于控制编译过程)

编译生成文件
obj文件夹(存放编译生成的中间文件.o文件)
.elf文件(可执行文件,包含调试信息)
.bin文件(存放最终生成的可执行文件)

反汇编(需要就用,这个一般不用管)
.dis文件(反汇编文件,查看汇编代码)

生成最终烧录文件
.imx文件(用于烧录的镜像文件)

烧录准备工具
imxdownload软件(用于烧录程序到芯片)

2.准备的文件

2.1 .vscode文件夹下的c_cpp_properties.json

在这里插入图片描述

这个文件是vscode的配置文件,主要用于配置C/C++语言的编译环境,包括头文件路径、编译器选项等。它帮助IDE正确地解析代码,提高代码补全和错误检查的准确性。

{
    "configurations": [
        {
            "name": "Win32",
            "includePath": [
                "${workspaceFolder}/**",

                "${workspaceFolder}/bsp/clk",

                "${workspaceFolder}/bsp/delay",

                "${workspaceFolder}/bsp/led",

                "${workspaceFolder}/bsp/beep",

                "${workspaceFolder}/imx6ul",

                "${workspaceFolder}/project"
            ],

            "defines": [
                "_DEBUG",
                "UNICODE",
                "_UNICODE"
            ],
            "intelliSenseMode": "msvc-x64"
        }
    ],
    "version": 4
}

这个文件是可要可不要的,缺失不会影响编译,只是会影响代码提示功能。有的时候代码标红报错可能是这个文件路径出了问题,可以手动修改这个文件来解决。因为编译本质上是通过makefile来完成的,而不是通过vscode来完成的。

2.2 imx6ul文件夹

在这里插入图片描述
这个文件夹下存放的是IMX6ULL芯片相关的驱动代码和配置文件。它包含了对芯片外设的初始化、操作函数等,是开发嵌入式应用程序的基础。我们一些相关芯片的驱动代码都放在这里面。

在这里插入图片描述

类似fsl_iomuxc.h这种一大啪啦文件,我们只管需要用的时候再来找就行了,不需要全部都去了解它们的作用。只要知道这个文件夹是存放芯片相关驱动代码和配置文件的就行了。

2.3 bsp文件夹

这是基于bsp工程管理的文件夹,一般bsp文件夹下会包含各个外设的驱动代码和配置文件。比如clk文件夹下存放的是时钟相关的驱动代码,delay文件夹下存放的是延时相关的驱动代码,led文件夹下存放的是LED灯相关的驱动代码,beep文件夹下存放的是蜂鸣器相关的驱动代码。我们一些外设的驱动代码都放在这里面。
一般是由一个.c和一个.h文件组成,比如led文件夹下就有led.c和led.h文件,分别是LED灯的驱动代码和头文件。.h文件写函数声明什么的,然后.c文件写函数,同时引用.h文件,写完这些方便我们之后在主函数调用。
在这里插入图片描述

在这里插入图片描述

为什么要使用这么一个文件夹呢?因为我们在开发过程中,可能会用到很多外设的驱动代码,如果把这些代码都放在主函数文件夹下,会显得很乱,不利于代码的管理和维护。所以我们把这些外设的驱动代码都放在bsp文件夹下,方便我们之后的调用和管理

2.4 project文件夹

project文件夹下存放的是主函数.c和.s文件。主函数.c文件是我们编写应用程序的主要文件,.s文件是汇编语言文件,一般用于编写启动代码和底层操作。

在这里插入图片描述

在这里插入图片描述

3.编译+链接相关文件

3.1 .lds文件(链接脚本文件,定义内存布局)

SECTIONS{
	. = 0X87800000;
	.text :
	{
		obj/start.o 
		*(.text)
	}

	.rodata ALIGN(4) : {*(.rodata*)}     
	.data ALIGN(4)   : { *(.data) }    
	__bss_start = .;    
	.bss ALIGN(4)  : { *(.bss)  *(COMMON) }    
	__bss_end = .;
}

3.2 Makefile文件(用于控制编译过程)

makefile文件类似下面这种,具体介绍可以去看我之前写的BSP工程管理文章,里面有表格说明参数定义,这里就不多介绍了。
在这里插入图片描述

4.编译生成文件

有了以上步骤后,我们就可以在终端进行make编译了,编译完成后会生成一个obj文件夹,里面存放的是编译生成的中间文件.o文件。同时还会生成.elf文件和.bin文件,分别是可执行文件和最终生成的可执行文件。
在这里插入图片描述

4.1 obj文件夹(存放编译生成的中间文件.o文件)

在这里插入图片描述

模块化管理:将.s(汇编源码)、.c(C 源码)编译生成的.o文件集中存放(如start.o、main.o、driver.o),避免中间文件与源码、最终镜像文件混杂,提升工程整洁度;
提升编译效率:修改单个源码文件时,仅需重新编译该文件生成对应的.o,无需重新编译所有源码,大幅缩短编译耗时;

4.2 .elf文件(可执行文件,包含调试信息)

程序完整性:包含代码段(.text)、数据段(.data)、未初始化段(.bss)等完整程序逻辑,且所有代码 / 数据已绑定芯片实际内存地址(如 i.MX6ULL 的 DDR 地址 0x80000000);
调试核心载体:内置 “源码行号↔机器码地址” 映射、变量名 / 函数名等调试信息,是 JLink/ST-Link 调试、GDB 单步调试的唯一依赖文件(无.elf则无法定位源码级错误);
镜像转换基础:后续.bin/.imx文件均基于.elf提取生成;

4.3 .bin文件(存放最终生成的可执行文件)

精简数据:通过objcopy工具移除.elf的调试信息、ELF 格式头,仅保留芯片可执行的纯机器码/数据
通用适配:几乎所有嵌入式芯片都能识别裸二进制格式,是跨平台的基础镜像文件;

4.4 .dis文件(反汇编文件,查看汇编代码)(需要就用,这个一般不用管)

对.elf/.bin文件执行反汇编(如objdump -D)生成的纯文本文件,属于开发辅助文件。可以查看编译后的汇编代码,帮助开发者理解编译器优化、定位低级别错误等,一般调试阶段才会用到。

5.生成最终烧录文件

5.1 .imx文件(用于烧录的镜像文件)

6.烧录准备工具

6.1 imxdownload软件(用于烧录程序到芯片)

在这里插入图片描述

我们将imxdownload软件cp复制到我们当前工程下面,并执行赋权限命令,imxdownload变绿了就可以使用软件烧录到sd卡或者emmc里面去了。

cp ~/imxdownload .
chmod 777 imxdownload

7.烧录

使用imxdownload软件进行烧录,具体步骤如下:

  1. 打开终端,进入当前工程目录。
  2. 插入sd卡,明确你烧写的sd卡设备路径,一般是/dev/sdb或者/dev/sdc,可以通过lsblk命令查看。
  3. 执行烧录命令:
./imxdownload -f your_image.imx -d /dev/sdX

将your_image.imx替换为你的.imx文件名,/dev/sdX替换为你的sd卡设备路径。
4. 等待烧录完成,完成后安全弹出sd卡。
在这里插入图片描述

以上就是IMX6ULL嵌入式烧录文件的总结,希望对大家有所帮助!

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐