IT986x芯片嵌入式Linux开发环境搭建全攻略

发布时间:2026/8/13 14:40:24
IT986x芯片嵌入式Linux开发环境搭建全攻略 1. 从零开始IT986x系列芯片开发环境搭建全景图如果你手头拿到了一块基于IT9862、IT9866或IT9868芯片的开发板准备大展拳脚那么第一道坎也是最关键的一步就是搭建一个“能用”且“好用”的开发环境。这不仅仅是安装几个软件那么简单它决定了你后续的开发效率、调试体验甚至项目能否顺利进行。很多新手开发者会在这里卡住面对一堆陌生的工具链、SDK和配置项感到无从下手。今天我就以一个过来人的身份结合我多次为不同项目搭建IT986x环境的经验为你梳理一条清晰、可复现的路径。我们的目标不是简单地罗列命令而是让你理解每一步背后的逻辑避开那些文档里不会写的“坑”最终搭建一个稳定、高效的专属开发工作站。IT986x系列是面向物联网、智能显示等应用的SoC其开发环境通常基于Linux核心包括交叉编译工具链、厂商SDK、以及一些必要的辅助工具。整个过程可以概括为准备一个干净的Linux宿主环境 - 获取并部署官方SDK - 配置交叉编译工具链 - 验证环境并跑通第一个示例。听起来步骤不多但魔鬼藏在细节里。接下来我们就一步步拆解。2. 宿主环境准备为什么推荐Ubuntu LTS工欲善其事必先利其器。选择一个稳定、兼容性好的宿主操作系统是基石。对于IT986x这类嵌入式开发强烈推荐使用Ubuntu 20.04 LTS或22.04 LTS。这不是随大流而是有充分理由的。首先LTS长期支持版本提供了长达5年的稳定更新和维护这意味着你在项目周期内几乎不会遇到因系统升级导致的底层库冲突问题。我见过有团队为了追求新特性使用了非LTS版本结果半年后一次系统更新导致glibc版本变化整个工具链都需要重新编译耽误了一周工期。其次绝大多数芯片原厂提供的SDK和工具链都是在Ubuntu环境下进行主要测试的社区支持和解决方案也最丰富。当你遇到一个诡异的编译错误时在Ubuntu环境下搜索到的有效解决方案概率远高于其他发行版。2.1 虚拟机、物理机还是WSL三种方案的深度抉择你有三种主要的选择在物理机上安装Ubuntu、使用虚拟机如VMware/VirtualBox、或者使用Windows Subsystem for Linux (WSL2)。每种方案都有其明确的适用场景。方案一物理机安装Ubuntu这是性能最佳、兼容性最好的方案。编译速度最快对USB设备如JTAG调试器、串口工具的访问最直接没有中间层带来的延迟或驱动问题。如果你的开发工作是全职或主要的并且有一台专属的机器这是首选。缺点是需要你完全切换到Linux桌面环境对于需要同时使用Windows特定软件如某些专业绘图或办公软件的开发者可能不便。方案二虚拟机VMware Workstation / VirtualBox这是灵活性最高的方案。你可以在Windows或macOS宿主系统上运行一个Ubuntu虚拟机随时切换文件共享方便。这对于需要兼顾多种环境的开发者非常友好。但是性能有损耗尤其是I/O操作。编译大型SDK时时间可能是物理机的1.5到2倍。此外USB设备穿透Passthrough有时会不稳定可能导致调试器连接时好时坏。我的经验是如果使用虚拟机务必为其分配足够的资源建议至少4核CPU、8GB内存、50GB固态硬盘空间并确保安装VMware Tools或VirtualBox Guest Additions来提升性能。方案三WSL2 (Windows Subsystem for Linux 2)这是微软提供的一个“轻量级虚拟机”方案。它比传统虚拟机启动更快资源占用更少并且与Windows文件系统的互操作性极佳。对于轻度开发或学习来说WSL2是一个不错的起点。但是对于IT986x这种涉及底层USB设备和可能需要进行内核开发的场景WSL2目前存在硬伤。WSL2对USB设备的支持需要额外配置且并不完善直接访问USB转串口或JTAG设备非常麻烦甚至不可行。因此如果你需要进行实际的烧录和硬件调试我不推荐WSL2作为主力开发环境。它更适合前期纯代码编辑和编译验证。注意无论选择哪种方案请确保系统有稳定的网络连接因为后续需要下载大量的软件包和源码。2.2 基础系统软件包安装确定好系统方案并安装好Ubuntu后第一件事是更新软件源并安装一系列基础开发工具。打开终端执行以下命令sudo apt update sudo apt upgrade -y sudo apt install -y build-essential git wget curl file sudo apt install -y python3 python3-pip python3-venv sudo apt install -y device-tree-compiler bc u-boot-tools sudo apt install -y libncurses5-dev libssl-dev bison flex我们来拆解一下这些包的作用build-essential: 包含GCC、G、make等核心编译工具是C/C开发的基石。git: 版本控制工具用于克隆SDK代码仓库。wget,curl: 网络下载工具。file: 用于查看文件类型在排查工具链问题时有用。python3及相关工具很多现代构建系统如Yocto、Buildroot以及部分厂商脚本依赖Python。device-tree-compiler: 设备树编译器嵌入式Linux开发必备。bc,u-boot-tools: 一些构建脚本会用到bc进行数学计算u-boot-tools用于处理U-Boot镜像。libncurses5-dev,bison,flex: 编译内核或配置menuconfig界面时需要。安装这些包可以避免在后续步骤中因缺少依赖而报错这是一种“前置投资”。3. 获取与解压SDK避开路径与权限的“暗礁”IT986x的SDK通常由芯片原厂或方案提供商提供可能是一个巨大的压缩包.tar.gz或.zip也可能是一个Git仓库。这里我们假设你拿到的是一个名为it986x_sdk_v1.0.tar.gz的压缩包。3.1 工作目录规划与解压建立一个清晰、干净的工作目录至关重要。我习惯在用户家目录下创建一个workspace或projects文件夹然后按芯片型号细分。mkdir -p ~/workspace/it986x cd ~/workspace/it986x将SDK压缩包放到这个目录下然后解压tar -xzvf it986x_sdk_v1.0.tar.gz解压后你可能会得到一个包含多个子目录的文件夹例如it986x_sdk/。请务必记录下这个SDK的完整路径例如/home/yourname/workspace/it986x/it986x_sdk。后续很多配置都依赖于这个路径。第一个常见坑路径中包含空格或中文。绝对不要将SDK放在像/home/yourname/桌面/IT9866 SDK/这样的路径下。很多构建脚本对空格和特殊字符的处理并不友好会导致各种难以排查的路径错误。坚持使用英文、无空格的路径。第二个常见坑文件权限。解压后的文件可能属于某个特定的用户ID。如果你是用sudo解压的文件所有者可能是root这会导致你在普通用户下无法修改。确保SDK目录及其内容的所有权是你当前的用户sudo chown -R $USER:$USER it986x_sdk/3.2 初探SDK目录结构进入SDK目录用ls命令查看。一个典型的IT986x SDK可能包含以下关键部分it986x_sdk/ ├── build/ # 构建脚本和配置目录核心所在 ├── kernel/ # Linux内核源码可能已经打了补丁 ├── uboot/ # U-Boot引导程序源码 ├── toolchain/ # **可能存放着交叉编译工具链** ├── out/ # 编译输出目录初始可能是空的 ├── vendor/ # 厂商提供的库、驱动和中间件 ├── app/ # 示例应用程序 └── docs/ # 开发文档仔细阅读首先找到文档docs/并阅读其中的README或Quick_Start文件。这是最权威的指南会说明该版本SDK的具体环境要求、构建命令和已知问题。很多开发者急于动手跳过文档结果在遇到问题时花费数倍的时间。其次关注toolchain/目录。如果SDK包内自带了交叉编译工具链那会省去很多麻烦。如果没有你就需要根据文档指引自行下载。4. 交叉编译工具链环境变量的艺术交叉编译工具链是嵌入式开发的“编译器”它运行在x86的PC上但生成的是ARM架构的可执行文件。对于IT986x通常是ARM Cortex-A系列常用的工具链前缀是arm-none-linux-gnueabihf-针对带硬浮点的ARMv7或aarch64-none-linux-gnu-针对ARMv8/AArch64。具体前缀需要根据芯片内核确定。4.1 安装与配置工具链情况ASDK自带工具链。这是最理想的情况。进入toolchain/目录你会发现类似gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf.tar.xz的压缩包。将其解压到合适的全局位置例如/optsudo tar -xJf gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf.tar.xz -C /opt解压后在/opt下会生成一个类似gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf的目录。情况B需要自行下载。如果SDK未提供你需要从ARM官方或Linaro网站下载。以ARM GNU Toolchain为例你可以访问其官网下载对应版本。例如下载一个适用于AArch32的版本cd /tmp wget https://developer.arm.com/-/media/Files/downloads/gnu-a/10.3-2021.07/binrel/gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf.tar.xz sudo tar -xJf gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf.tar.xz -C /opt4.2 配置环境变量永久生效的关键安装好工具链后需要让系统知道它的位置。这通过设置PATH环境变量实现。我强烈反对在终端里直接用export PATH...临时设置因为关闭终端就失效了也容易忘记。推荐的方法是修改用户家目录下的shell配置文件。如果你用的是bash默认编辑~/.bashrc文件如果用zsh编辑~/.zshrc。nano ~/.bashrc在文件末尾添加以下行请根据你的实际工具链路径修改# IT986x Toolchain export TOOLCHAIN_PATH/opt/gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf export PATH$TOOLCHAIN_PATH/bin:$PATH export CROSS_COMPILEarm-none-linux-gnueabihf- export ARCHarmTOOLCHAIN_PATH: 定义了工具链根目录方便其他脚本引用。PATH: 将工具链的bin目录添加到系统路径最前面这样你在任何地方都可以直接调用arm-none-linux-gnueabihf-gcc等命令。CROSS_COMPILE: 设置交叉编译前缀这是内核和U-Boot构建系统识别的变量。ARCH: 设置目标架构为arm。保存文件后执行以下命令使配置立即生效source ~/.bashrc现在验证工具链是否安装成功arm-none-linux-gnueabihf-gcc --version你应该能看到GCC的版本信息。如果提示“命令未找到”请仔细检查路径是否正确以及是否执行了source命令。一个重要的经验保持工具链版本与SDK推荐版本一致。不要随意使用过新或过旧的工具链不同版本的GCC在默认编译选项、链接库行为上可能有细微差别可能导致编译出的内核或应用在板子上运行时出现玄学问题。SDK文档里推荐的版本是经过充分测试的。5. 构建系统初体验编译第一个内核镜像环境变量配置好后我们就可以尝试编译SDK中最核心的部分Linux内核。这个过程会验证你的工具链、环境依赖是否全部就绪。进入SDK的kernel目录通常的步骤是cd ~/workspace/it986x/it986x_sdk/kernel make it9866_defconfig # 根据你的芯片型号选择可能是it9862_defconfig等 make menuconfig # 可选进行内核配置初学者可以先跳过直接使用默认配置 make -j$(nproc) # 开始编译-j参数利用多核加速$(nproc)会自动获取你的CPU核心数make defconfig: 载入一个预设的、针对该芯片开发板的默认内核配置文件.config。make menuconfig: 这是一个基于文本界面的内核配置工具。你可以在这里增减内核模块、驱动等。第一次搭建环境时建议先不要做任何修改直接退出保存目的是确保默认配置能编译通过。等环境完全跑通后再根据项目需求进行定制。make -j$(nproc): 开始编译。-j后面跟数字表示并行编译的作业数$(nproc)命令会返回你CPU的逻辑核心数这样可以最大化利用CPU资源显著缩短编译时间。编译过程可能会持续几分钟到十几分钟取决于你的CPU性能。如果一切顺利你会在arch/arm/boot/目录下找到生成的zImage内核镜像文件以及在arch/arm/boot/dts/目录下找到编译好的设备树二进制文件.dtb。5.1 编译中可能遇到的典型错误与解决错误1: “找不到交叉编译工具链”make: arm-none-linux-gnueabihf-gcc: Command not found这说明PATH环境变量设置不正确。请回到第4.2节检查.bashrc文件中的路径是否正确并确认执行了source ~/.bashrc。你也可以在终端直接echo $PATH查看路径是否包含工具链的bin目录。错误2: “缺少头文件或库”fatal error: openssl/opensslv.h: No such file or directory这是缺少开发库-dev包的典型错误。错误信息会明确指出缺少什么。例如上述错误是因为缺少libssl-dev。解决方法就是用apt安装对应的开发包sudo apt install libssl-dev在编译过程中你可能需要根据错误提示反复安装多个开发包如libncurses-dev,libelf-dev等。这正是我们在第2.2节提前安装一批常用包的原因可以避免大部分此类问题。错误3: 内核版本或工具链版本不匹配导致的语法错误这类错误比较棘手可能表现为某个C文件中的语法错误。首先应确认你使用的工具链版本是否是SDK文档明确要求的。如果不是请更换为指定版本。如果版本正确可能是SDK代码本身在非预期环境下的问题此时可以尝试在SDK供应商的论坛、社区或通过技术支持渠道寻找是否有相关补丁。6. 构建完整系统使用SDK顶层构建脚本单独编译内核只是第一步。一个完整的嵌入式Linux系统还包括U-Boot、根文件系统rootfs以及各种应用程序。成熟的SDK通常会提供一个顶层的构建脚本比如build.sh、Makefile或基于Buildroot/Yocto的构建系统让你可以一键编译出整个系统镜像。回到SDK的根目录查找主要的构建说明。例如cd ~/workspace/it986x/it986x_sdk ls -la build/你可能会看到一个build.sh脚本或者一个Makefile。执行前再次阅读docs/下的文档了解具体的构建目标。一个典型的命令可能是./build.sh all # 编译所有组件 # 或 ./build.sh uboot # 仅编译uboot ./build.sh kernel # 仅编译kernel ./build.sh rootfs # 构建根文件系统 ./build.sh pack # 将所有镜像打包成可用于烧录的单一文件这个顶层脚本会按照正确的顺序调用内核、U-Boot、根文件系统等的编译规则并处理它们之间的依赖关系。执行./build.sh all是对你开发环境的一次全面体检。6.1 构建根文件系统选择与策略根文件系统是系统运行的用户空间环境。SDK可能提供几种选择预编译的根文件系统镜像最简单直接使用。但定制性差。使用Buildroot构建SDK里可能集成了Buildroot配置。Buildroot是一个可以高度定制、轻量级的根文件系统构建工具。执行./build.sh rootfs可能会启动Buildroot的配置和编译。这个过程会下载大量软件包需要良好的网络环境且时间较长。使用Yocto/OpenEmbedded构建更强大、更灵活但学习曲线陡峭构建时间极长。一般用于产品级开发。对于初学者和环境验证建议先使用SDK提供的默认配置可能是Buildroot的最小化配置进行构建。目的是先得到一个能启动的系统。后续再根据应用需求学习如何通过Buildroot的make menuconfig来添加或删除软件包如Python、OpenSSH、自定义应用等。在构建根文件系统时可能会遇到下载失败网络超时的问题。这是因为Buildroot需要从全球各地的源码服务器下载软件包。解决方法一是使用代理二是手动将失败的包下载到Buildroot的dl/目录下。SDK供应商有时也会提供一个本地的dl包你可以将其解压到对应位置避免在线下载。7. 开发辅助环境配置效率提升利器基础编译环境搭建好后配置一个高效的代码编辑和调试环境能极大提升生产力。7.1 代码编辑与浏览VSCode 插件Visual Studio Code (VSCode) 是目前嵌入式开发非常流行的选择。安装VSCode后推荐安装以下插件C/C (Microsoft)提供代码智能感知、跳转、错误提示。DeviceTree: 设备树文件语法高亮和支持。Remote - SSH: 如果你在远程服务器或虚拟机上开发可以用这个插件远程连接并编辑代码体验和本地几乎一致。为了让VSCode的C/C插件正确识别交叉编译环境你需要配置c_cpp_properties.json文件。在VSCode中打开SDK根目录按CtrlShiftP输入“C/C: Edit Configurations (UI)”在配置界面中将“Compiler path”设置为你的交叉编译器路径如/opt/gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf/bin/arm-none-linux-gnueabihf-gcc。在“IncludePath”中添加SDK内核头文件路径、U-Boot头文件路径以及工具链自带的库头文件路径。例如${workspaceFolder}/kernel/include ${workspaceFolder}/kernel/arch/arm/include /opt/gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf/arm-none-linux-gnueabihf/include将“IntelliSense mode”设置为gcc-arm。这样配置后VSCode就能对SDK中的代码提供准确的智能提示和跳转。7.2 串口调试Minicom vs. Picocom与开发板通信最常用的方式是串口。你需要一个USB转TTL串口模块。在Linux下常用的串口终端工具有minicom和picocom。安装Minicomsudo apt install minicom配置Minicom以/dev/ttyUSB0为例端口号请根据实际情况调整sudo minicom -s在配置界面选择“Serial port setup”设置Serial Device:/dev/ttyUSB0Bps/Par/Bits:115200 8N1(波特率根据板子实际设置115200是常见值)硬件流控制和软件流控制都设为NO。然后选择“Save setup as dfl”保存为默认配置以后只需运行minicom即可连接。picocom更轻量用法简单sudo apt install picocom picocom -b 115200 /dev/ttyUSB0退出picocom按CtrlA然后按CtrlX。串口权限问题普通用户通常没有直接访问/dev/ttyUSB*的权限。每次都要sudo很麻烦。一劳永逸的解决方法是把你的用户加入dialout组sudo usermod -a -G dialout $USER执行后需要注销并重新登录改动才会生效。8. 环境验证与“Hello, World”环境搭建的最后一步也是最重要的一步就是实际验证。编译一个最简单的应用程序下载到开发板上运行。在SDK目录外避免污染源码创建一个测试文件hello.c#include stdio.h int main() { printf(Hello, IT986x!\n); return 0; }使用交叉编译工具链编译它arm-none-linux-gnueabihf-gcc -o hello hello.c -static-static参数进行静态链接将程序依赖的库都打包进可执行文件这样就不需要板子的根文件系统里包含对应的动态库简化测试。将生成的hello文件通过串口使用sz命令、TF卡、或者网络如tftp、scp等方式拷贝到开发板的根文件系统中。在开发板的串口终端里给文件添加执行权限并运行chmod x hello ./hello如果屏幕上成功打印出“Hello, IT986x!”那么恭喜你你的交叉编译环境、文件传输路径以及板子的基本运行环境都是通的这是一个重要的里程碑。如果运行失败提示“not found”或“Permission denied”检查文件是否完整传输、权限是否正确。如果提示“格式错误”例如“exec format error”那可能是编译时用的工具链架构与板子CPU架构不匹配需要回头检查CROSS_COMPILE的设置。至此一个完整的IT986x系列芯片开发环境已经搭建并验证成功。从选择一个稳定的Linux发行版开始到规划目录、安装工具链、配置环境变量再到编译内核、构建系统最后配置高效的编辑和调试工具每一步都蕴含着避免未来踩坑的考量。记住嵌入式开发环境的搭建本身就是一项重要的技能耐心和细致地走通这个过程会为你后续的深入开发打下最坚实的基础。当你下次拿到一块新的开发板时这套方法论依然适用你只需要根据具体的芯片型号和SDK要求调整工具链和配置细节即可。