3. SDK与开发环境搭建

在上一节确认了硬件平台与启动介质之后,本节要解决的是"软件从哪来、怎么编译、怎么送到板子上跑起来"这条完整链路。对于 TI Sitara 系列(以 AM335x/AM437x/AM57xx 为例),官方提供的 Processor SDK 是整套开发的起点,它把 U-Boot、Linux 内核、设备树、根文件系统、交叉编译工具链以及各类示例程序打包在一起,避免开发者逐个组件去拼装。本节以 Processor SDK Linux 为例,走通"安装 SDK → 配置交叉编译工具链 → 搭建 TFTP/NFS 启动环境 → 用 CCS 与命令行编译 → 运行 Hello World"这条主线。

一、Processor SDK 的组成与安装

Processor SDK Linux 通常以 .bin 自解压安装包形式发布,命名类似 ti-processor-sdk-linux-am335x-evm-08.02.00.24-Linux-x86-Install.bin。安装前先确认宿主机是 Ubuntu 18.04/20.04 这类官方支持的 64 位发行版,并预留约 30 GB 磁盘空间。安装过程本身很简单:

chmod +x ti-processor-sdk-linux-am335x-evm-08.02.00.24-Linux-x86-Install.bin
./ti-processor-sdk-linux-am335x-evm-08.02.00.24-Linux-x86-Install.bin
# 按提示选择安装目录,例如 /home/ti/sdk

安装完成后,SDK 目录下会出现几个关键子目录:linux-devkit/ 存放交叉编译工具链与目标机 sysroot;board-support/ 存放 U-Boot、内核源码与设备树;bin/ 提供 create-sdcard.sh 等制卡脚本;filesystem/ 提供预编译的根文件系统。理解这个目录结构,后续定位工具链和内核源码就不会迷路。

二、配置交叉编译工具链

Sitara 是 ARM 架构,宿主机是 x86_64,因此必须使用交叉编译器。SDK 自带的工具链位于 linux-devkit/sysroots/x86_64-arago-linux/usr/bin/,前缀为 arm-linux-gnueabihf-(AM335x/AM437x 为 32 位 ARMv7)。最省事的做法是执行 SDK 提供的环境脚本:

cd /home/ti/sdk
source linux-devkit/environment-setup
arm-linux-gnueabihf-gcc -v   # 验证工具链可用

执行 environment-setup 后,脚本会自动设置 PATH、CC、CROSS_COMPILE、ARCH、SDKTARGETSYSROOT 等变量。其中 SDKTARGETSYSROOT 指向目标机头文件与库的根目录,交叉编译时通过 --sysroot 引用,保证链接的是目标机而非宿主机的库。若不想每次手动 source,可把该命令写入 ~/.bashrc。需要提醒的是:environment-setup 会覆盖部分宿主环境变量,建议在专用终端里使用,避免影响宿主机本地编译。

三、搭建 TFTP 与 NFS 启动环境

开发阶段频繁烧写 SD 卡效率很低,更常用的方式是让 U-Boot 通过 TFTP 从宿主机下载内核与设备树,再通过 NFS 挂载根文件系统。这样改一次内核或应用,重启板子即可生效。宿主机侧需要安装并配置这两个服务:

sudo apt install tftp-hpa tftpd-hpa nfs-kernel-server
# /etc/default/tftpd-hpa
TFTP_DIRECTORY="/home/ti/tftpboot"
TFTP_OPTIONS="-l -c -s"

# /etc/exports
/home/ti/nfsroot *(rw,sync,no_root_squash,no_subtree_check)

sudo systemctl restart tftpd-hpa nfs-kernel-server

把编译出的 zImage、am335x-evm.dtb 放入 /home/ti/tftpboot,把根文件系统解压到 /home/ti/nfsroot。然后在 U-Boot 命令行设置启动参数(以 AM335x EVM 为例,宿主机 IP 假设为 192.168.1.100,板子为 192.168.1.50):

setenv ipaddr 192.168.1.50
setenv serverip 192.168.1.100
setenv bootargs console=ttyO0,115200n8 root=/dev/nfs rw \
  nfsroot=192.168.1.100:/home/ti/nfsroot ip=192.168.1.50
tftp 0x82000000 zImage
tftp 0x88000000 am335x-evm.dtb
bootz 0x82000000 - 0x88000000

看到内核启动日志并最终进入登录提示符,说明 TFTP/NFS 链路已经打通。这一步是后续所有应用调试的基础。

Sitara 开发环境搭建与 Hello World 运行链路 宿主机 Ubuntu (x86_64) Processor SDK 安装目录 linux-devkit / board-support / filesystem 交叉编译工具链 arm-linux-gnueabihf-gcc + sysroot TFTP 服务 zImage / dtb NFS 服务 根文件系统 CCS / 命令行编译 → hello 可执行文件 以太网 TFTP/NFS Sitara 目标板 (ARM) U-Boot tftp 下载 zImage / dtb Linux 内核 + 设备树 bootz 启动 NFS 根文件系统 挂载 /home/ti/nfsroot 运行 hello 输出 Hello, Sitara! 编译在宿主机完成,运行在目标板;TFTP 传内核,NFS 挂根文件系统

四、用 CCS 与命令行两种方式编译

命令行方式最直接。写一个最小程序:

#include <stdio.h>
int main(void) {
    printf("Hello, Sitara!\n");
    return 0;
}

用交叉编译器编译并查看目标架构:

arm-linux-gnueabihf-gcc hello.c -o hello
file hello
# hello: ELF 32-bit LSB executable, ARM, EABI5 ...

如果 file 显示的是 ARM 架构,说明交叉编译成功;若显示 x86-64,则说明用错了编译器。把 hello 复制到 NFS 根目录(例如 /home/ti/nfsroot/home/root/),在板子串口终端里执行 ./hello,看到 Hello, Sitara! 即完成闭环。

CCS(Code Composer Studio)适合需要图形化调试的场景。新建工程时选择对应的 Sitara 器件与 GCC 工具链,把 SDK 的 linux-devkit 路径配置进工程;编译后可通过 CCS 的远程调试功能,借助板子上的 gdbserver 进行源码级单步调试。对于纯应用开发,命令行 + gdb 往往更轻量;对于涉及 PRU、DSP 或需要 JTAG 的场景,CCS 的优势更明显。

首次运行 ./hello 若提示 Permission denied,执行 chmod +x hello;若提示 No such file or directory,通常是动态链接器路径不匹配,可改用 -static 静态编译验证。

五、常见问题与判断依据

搭建过程中最容易卡住的几个点:一是 environment-setup 未 source 导致找不到交叉编译器;二是 TFTP 目录权限或防火墙拦截,表现为 U-Boot 里 tftp 超时;三是 NFS 的 bootargs 中 nfsroot 路径写错,内核会报 VFS: Unable to mount root fs;四是内核与设备树版本不匹配,表现为启动到一半卡死。判断链路是否正常,可以按"U-Boot 能否 ping 通宿主机 → tftp 能否下载 → 内核能否挂载 NFS → 能否进入 shell"的顺序逐段排查,每段都有明确的成功标志,比盲目重试高效得多。