3. 开发环境搭建

AM64x 的 BSP 开发不是“装一个编译器就能跑”的简单流程,而是由 SDK 安装、交叉编译工具链 与 Yocto/OpenEmbedded 构建系统 三层能力叠加而成。SDK 提供开箱即用的工具链、根文件系统与示例;交叉编译工具链负责在 x86_64 主机上生成 ARM64 目标代码;Yocto/OpenEmbedded 则负责从源码级重建 U-Boot、Linux 内核、设备树与根文件系统。三者关系可以用下面的结构图理解。

AM64x BSP 开发环境三层结构 主机 Ubuntu → 工具链/SDK → Yocto 构建 → 目标板镜像 ① 主机环境(Host) Ubuntu 20.04/22.04 LTS · 磁盘 ≥ 120 GB · 内存 ≥ 16 GB · 必备包:git、python3、gawk、wget、diffstat、chrpath、cpio、texinfo 建议独立分区 /home 用于 Yocto 构建缓存,避免系统盘被 sstate-cache 占满 ② Processor SDK(预编译) ti-processor-sdk-linux-am64xx-evm-xx.xx.xx.xx 包含:交叉工具链、U-Boot、Kernel、DTB、 根文件系统、示例程序、setup.sh 环境脚本 用途:快速验证板卡、跑通第一个 Hello World ③ 交叉编译工具链 aarch64-oe-linux-gcc / aarch64-none-linux-gnu-gcc sysroot 指向 SDK 根文件系统,提供目标库头文件 环境变量:PATH、CC、CXX、SYSROOT、ARCH 用途:编译驱动、应用、第三方库 ④ Yocto / OpenEmbedded 构建系统(源码级重建) Poky + meta-ti + meta-arm + meta-openembedded → bitbake tisdk-default-image 输出:tiboot3.bin、tispl.bin、u-boot.img、Image、k3-am642-evm.dtb、tisdk-rootfs-image.wic 关键目录:build/conf/local.conf、bblayers.conf、tmp/deploy/images/am64xx-evm/ SDK 用于快速验证,Yocto 用于产品化定制

一、核心原理:三层环境各司其职

AM64x 采用 ARM Cortex-A53 作为主应用核,因此主机(通常是 x86_64 Ubuntu)无法直接运行目标程序,必须使用 aarch64 交叉编译工具链。TI 的 Processor SDK 已经把工具链、内核、U-Boot、根文件系统打包好,安装后执行 setup.sh 即可把工具链加入 PATH。而 Yocto/OpenEmbedded 是一套“配方(recipe)+ 层(layer)”驱动的构建框架,它通过 BitBake 解析 .bb 配方,从源码下载、打补丁、配置、编译到打包,最终生成可烧录的 WIC 镜像。

关键认知:SDK 与 Yocto 不是二选一。SDK 适合“今天就要点亮板子”的快速验证;Yocto 适合“修改内核配置、裁剪根文件系统、加入自研驱动”的产品化阶段。两者共用同一套工具链前缀与 sysroot 思路。

二、方法流程:从零搭建可编译环境

  1. 安装主机依赖:在 Ubuntu 上安装 Yocto 必需包,避免构建中途因缺少 chrpath、diffstat 等工具失败。
  2. 安装 Processor SDK:下载 ti-processor-sdk-linux-am64xx-evm-xx.xx.xx.xx-Linux-x86-Install.bin,赋予执行权限后安装到 /opt/ti。
  3. 激活 SDK 环境:执行 source setup.sh,验证 aarch64-oe-linux-gcc -v 能输出版本信息。
  4. 准备 Yocto 层:克隆 Poky、meta-ti、meta-arm、meta-openembedded,并写入 bblayers.conf。
  5. 配置 local.conf:设置 MACHINE = "am64xx-evm"、DISTRO = "arago",并按需开启 DL_DIR 与 SSTATE_DIR 缓存。
  6. 执行构建:运行 bitbake tisdk-default-image,首次构建约 2~4 小时,后续增量构建可缩短到分钟级。
# 1. 主机依赖(Ubuntu 22.04)
sudo apt-get install -y gawk wget git diffstat unzip texinfo \
  gcc build-essential chrpath socat cpio python3 python3-pip \
  python3-pexpect xz-utils debianutils iputils-ping libsdl1.2-dev \
  xterm zstd liblz4-tool file locales

# 2. 安装 SDK 并激活
chmod +x ti-processor-sdk-linux-am64xx-evm-09.01.00.08-Linux-x86-Install.bin
./ti-processor-sdk-linux-am64xx-evm-09.01.00.08-Linux-x86-Install.bin
cd /opt/ti/processor-sdk-linux-am64xx-evm-09.01.00.08
source setup.sh

# 3. 验证交叉工具链
aarch64-oe-linux-gcc -v
aarch64-oe-linux-gcc hello.c -o hello_arm64
file hello_arm64   # 应显示 ARM aarch64

三、Yocto/OpenEmbedded 配置要点

Yocto 构建的核心是 conf 目录下的两个文件:bblayers.conf 决定“用哪些层”,local.conf 决定“构建成什么样”。AM64x 必须包含 meta-ti 提供的机器定义与 U-Boot/Kernel 配方,同时 meta-arm 提供 ARM 通用组件,meta-openembedded 提供大量第三方库。

# build/conf/bblayers.conf 关键片段
BBLAYERS ?= " \
  ${TOPDIR}/../sources/poky/meta \
  ${TOPDIR}/../sources/poky/meta-poky \
  ${TOPDIR}/../sources/meta-ti/meta-ti-bsp \
  ${TOPDIR}/../sources/meta-ti/meta-ti-extras \
  ${TOPDIR}/../sources/meta-arm/meta-arm \
  ${TOPDIR}/../sources/meta-arm/meta-arm-toolchain \
  ${TOPDIR}/../sources/meta-openembedded/meta-oe \
  ${TOPDIR}/../sources/meta-openembedded/meta-python \
  ${TOPDIR}/../sources/meta-openembedded/meta-networking \
"

# build/conf/local.conf 关键片段
MACHINE = "am64xx-evm"
DISTRO = "arago"
DL_DIR = "/home/ti/yocto/downloads"
SSTATE_DIR = "/home/ti/yocto/sstate-cache"
BB_NUMBER_THREADS = "8"
PARALLEL_MAKE = "-j 8"
环境要素 SDK 方式 Yocto 方式 典型用途
工具链 SDK 自带 aarch64-oe-linux-gcc BitBake 自动构建交叉工具链 编译应用/驱动
内核与 DTB 预编译 Image + k3-am642-evm.dtb 从源码按配方重建 修改驱动/设备树
根文件系统 预打包 tisdk-rootfs-image 按 IMAGE_INSTALL 裁剪 产品化裁剪
构建时间 安装即用,分钟级 首次 2~4 小时,增量分钟级 快速验证 vs 深度定制
输出镜像 SDK 预置 .wic / .img tmp/deploy/images/am64xx-evm/ 烧录到 SD/eMMC

四、案例与场景:编译一个 AM64x 应用

假设我们要在 AM64x 上运行一个读取 GPIO 的小程序。使用 SDK 工具链时,只需在主机上执行交叉编译,然后把可执行文件通过 scp 或 SD 卡拷贝到目标板:

# 主机交叉编译
source /opt/ti/processor-sdk-linux-am64xx-evm-09.01.00.08/setup.sh
aarch64-oe-linux-gcc gpio_demo.c -o gpio_demo -lgpiod

# 拷贝到目标板(假设板卡 IP 为 192.168.1.100)
scp gpio_demo root@192.168.1.100:/usr/bin/

# 目标板运行
ssh root@192.168.1.100
gpio_demo --chip gpio0 --line 12

如果该程序需要作为产品固件的一部分,则应编写 Yocto 配方,把源码纳入 meta-custom 层,通过 IMAGE_INSTALL:append = " gpio-demo" 将其打入根文件系统,实现“一次构建、整包烧录”。

实用技巧:首次 Yocto 构建前,先执行 bitbake core-image-minimal 验证层配置是否正确,再构建完整 tisdk-default-image,可显著降低排错成本。

五、常见误区与复盘

  • 误区一:不执行 setup.sh 就直接编译。结果找不到 aarch64-oe-linux-gcc,或链接到主机 x86 库。每次新开终端都应重新 source。
  • 误区二:Yocto 构建目录放在 NFS 或 Windows 共享盘。会导致文件权限、符号链接与大小写问题,构建随机失败。务必使用本地 ext4 分区。
  • 误区三:忽略 sstate-cache 与 DL_DIR。每次全量重建耗时巨大。把这两个目录固定到独立磁盘,可让二次构建从小时级降到分钟级。
  • 误区四:混用 SDK 与 Yocto 的 sysroot。SDK 的 sysroot 与 Yocto 构建出的根文件系统版本可能不一致,链接第三方库时会出现 ABI 不匹配。产品化阶段应统一使用 Yocto 生成的 SDK(bitbake meta-toolchain)。
排障提示:若 bitbake 报 ERROR: Layer meta-ti is not compatible with the core layer,通常是 Poky 与 meta-ti 分支不匹配。请确认两者使用同一 Yocto 版本分支(如 kirkstone 对应 4.0),不要混用 master 与稳定分支。

完成本节环境搭建后,你应具备三种能力:用 SDK 工具链快速编译并运行一个 ARM64 程序;用 Yocto 配置层并启动一次完整镜像构建;在出现工具链或层兼容问题时,能定位到 PATH、sysroot、bblayers.conf 或分支版本这四个关键点。这是后续驱动开发、设备树修改与系统裁剪的基础。