1. IMX6ULL开发环境搭建

第一次接触IMX6ULL开发板时,最头疼的就是环境配置。记得我刚开始折腾这块板子的时候,光是装交叉编译器就反复折腾了好几次。下面分享一套经过实战验证的环境搭建方案,帮你避开那些新手常见的坑。

首先需要准备一台运行Ubuntu的电脑,建议使用18.04或20.04版本。这两个版本经过大量开发者验证,软件兼容性最好。打开终端,执行以下命令安装必备工具链:

sudo apt update
sudo apt install -y make gcc-arm-linux-gnueabihf gcc bison flex \
libssl-dev dpkg-dev lzop vim libncurses5-dev

这里有个细节要注意:arm-linux-gnueabihf编译器是专门为ARM架构设计的,带hf后缀表示支持硬件浮点运算,这对IMX6ULL这种带浮点运算单元的芯片特别重要。我曾经试过用不带hf的编译器,结果编译出来的内核运行时会报浮点指令错误。

安装完成后,建议验证下交叉编译器是否正常工作:

arm-linux-gnueabihf-gcc --version

如果看到类似"arm-linux-gnueabihf-gcc (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0"的输出,说明环境基本就绪。接下来还需要配置下终端环境变量,把交叉编译工具链加入PATH:

echo 'export PATH=$PATH:/usr/bin/arm-linux-gnueabihf' >> ~/.bashrc
source ~/.bashrc

2. 获取Linux内核源码

IMX6ULL的内核源码获取主要有三个渠道:官方内核、NXP维护版本和开发板厂商定制版。作为新手,我强烈建议从开发板厂商提供的源码开始。官方内核虽然更新,但缺少板级支持包(BSP),需要自己移植设备树和驱动,这对新手来说简直是噩梦。

以野火开发板为例,获取其定制内核非常简单:

git clone https://gitee.com/Embedfire/ebf_linux_kernel_6ull_depth1
cd ebf_linux_kernel_6ull_depth1

这个仓库已经包含了完整的设备树文件和针对IMX6ULL的优化配置。我曾经对比过官方内核和定制内核的启动时间,定制内核因为做了各种优化,启动速度能快30%左右。

源码目录结构需要重点关注几个地方:

  • arch/arm/boot/dts:存放设备树文件,不同版本的开发板对应不同的.dtb文件
  • drivers:驱动程序目录,比如GPIO、I2C等外设驱动都在这里
  • include:内核头文件,开发驱动时会经常用到
  • scripts:包含各种实用脚本,比如menuconfig的配置脚本

3. 内核配置与编译实战

3.1 编译zImage镜像

zImage是最常用的内核格式,适合直接烧写到开发板运行。编译前需要先清理工程:

sudo make distclean

这个步骤很多人会忽略,但特别重要。我就遇到过因为没清理导致配置冲突的情况,编译出来的内核根本无法启动。

接下来加载默认配置:

sudo make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- npi_v7_defconfig

这里的npi_v7_defconfig是野火提供的默认配置文件,已经针对IMX6ULL做了优化。如果想自定义配置,可以运行:

sudo make menuconfig ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-

在菜单界面里,新手建议先保持默认设置。等熟悉后再尝试调整,比如增加文件系统支持或启用特定驱动。

开始编译:

sudo make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j$(nproc)

-j$(nproc)参数会让编译使用所有CPU核心,大幅提升编译速度。在我的i7笔记本上,完整编译大约需要15分钟。

编译完成后,在arch/arm/boot目录下会生成zImage文件,在arch/arm/boot/dts目录下会有对应的.dtb设备树文件。这两个文件需要一起使用。

3.2 编译deb安装包

如果想通过包管理系统更新内核,可以编译deb格式的安装包。野火提供了便捷的编译脚本:

sudo ./make_deb.sh

这个脚本会自动完成所有编译步骤,并在build_image目录下生成.deb文件。把deb包拷贝到开发板后,执行:

sudo dpkg -i linux-image-*.deb

更新完成后重启即可。这种方式特别适合需要频繁更新内核的场景,比如驱动开发调试阶段。

4. 常见问题排查

编译过程中最常遇到的错误是依赖缺失。比如在Ubuntu 22.04上可能会遇到"multiple definition of `yylloc'"错误,这是因为新版本的flex工具链有变化。解决方法是指定兼容模式:

sudo make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- LEX=flex -j$(nproc)

另一个常见问题是设备树编译错误。如果修改了设备树文件但编译失败,可以先尝试单独编译设备树:

sudo make ARCH=arm dtbs

内核启动时如果卡住,可以通过串口查看启动日志。常见的启动问题包括:

  • 内存配置错误:表现为内核panic
  • 设备树不匹配:外设无法正常工作
  • 驱动缺失:某些功能无法使用

5. 自动化编译技巧

每次手动输入一长串编译命令既容易出错又浪费时间。可以创建编译脚本imx6ull_kernel.sh:

#!/bin/bash
make distclean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- npi_v7_defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j$(nproc)

给脚本添加执行权限:

chmod +x imx6ull_kernel.sh

以后只需要运行./imx6ull_kernel.sh就能自动完成整个编译过程。对于更复杂的项目,可以考虑使用Makefile管理编译流程,或者集成到CI/CD系统中实现自动化构建。

在实际项目中,我通常会维护不同的配置分支,比如开发版、稳定版和性能优化版。通过git分支管理这些配置,可以快速切换不同的编译选项:

git checkout performance-optimized
./imx6ull_kernel.sh

这种工作流大大提高了开发效率,特别是在需要针对不同场景测试内核性能时。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐