3. 开发环境搭建
AM64x 的 BSP 开发不是“装一个编译器就能跑”的简单流程,而是由 SDK 安装、交叉编译工具链 与 Yocto/OpenEmbedded 构建系统 三层能力叠加而成。SDK 提供开箱即用的工具链、根文件系统与示例;交叉编译工具链负责在 x86_64 主机上生成 ARM64 目标代码;Yocto/OpenEmbedded 则负责从源码级重建 U-Boot、Linux 内核、设备树与根文件系统。三者关系可以用下面的结构图理解。
一、核心原理:三层环境各司其职
AM64x 采用 ARM Cortex-A53 作为主应用核,因此主机(通常是 x86_64 Ubuntu)无法直接运行目标程序,必须使用 aarch64 交叉编译工具链。TI 的 Processor SDK 已经把工具链、内核、U-Boot、根文件系统打包好,安装后执行 setup.sh 即可把工具链加入 PATH。而 Yocto/OpenEmbedded 是一套“配方(recipe)+ 层(layer)”驱动的构建框架,它通过 BitBake 解析 .bb 配方,从源码下载、打补丁、配置、编译到打包,最终生成可烧录的 WIC 镜像。
二、方法流程:从零搭建可编译环境
- 安装主机依赖:在 Ubuntu 上安装 Yocto 必需包,避免构建中途因缺少
chrpath、diffstat等工具失败。 - 安装 Processor SDK:下载
ti-processor-sdk-linux-am64xx-evm-xx.xx.xx.xx-Linux-x86-Install.bin,赋予执行权限后安装到/opt/ti。 - 激活 SDK 环境:执行
source setup.sh,验证aarch64-oe-linux-gcc -v能输出版本信息。 - 准备 Yocto 层:克隆 Poky、meta-ti、meta-arm、meta-openembedded,并写入
bblayers.conf。 - 配置 local.conf:设置
MACHINE = "am64xx-evm"、DISTRO = "arago",并按需开启DL_DIR与SSTATE_DIR缓存。 - 执行构建:运行
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" 将其打入根文件系统,实现“一次构建、整包烧录”。
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 或分支版本这四个关键点。这是后续驱动开发、设备树修改与系统裁剪的基础。