3. 工业Linux开发环境搭建

在 Sitara 平台上做工业 Linux 开发,第一步不是写代码,而是把“主机—目标板”这条开发链路搭通。Sitara(如 AM335x、AM62x)属于 ARM 架构,主机通常是 x86_64 的 Ubuntu,两者指令集不同,因此必须使用交叉编译工具链在主机上生成 ARM 可执行文件,再通过串口或网络部署到目标板运行。本节围绕工具链、SDK、串口与网络调试环境,以及主机与目标板的协同工作流展开。

一、交叉编译工具链:为什么不能直接用 gcc

主机 gcc 生成的是 x86_64 指令,放到 ARM 目标板上会直接报“无法执行二进制文件”。交叉编译工具链由 binutils(as、ld、objcopy)、gcc、glibc/uClibc 以及内核头文件组成,命名通常带有目标三元组前缀,例如 arm-linux-gnueabihf-(32 位硬浮点)或 aarch64-linux-gnu-(64 位)。TI 的 Processor SDK 会自带匹配其内核与根文件系统的工具链,建议优先使用 SDK 内工具链,避免 libc 版本与目标板根文件系统不一致导致运行期符号缺失。

验证工具链是否可用,可执行:

arm-linux-gnueabihf-gcc -v
arm-linux-gnueabihf-gcc -dumpmachine
# 期望输出类似:arm-linux-gnueabihf

写一个最小程序验证交叉编译与运行闭环:

// hello.c
#include <stdio.h>
int main(void){ printf("hello sitara\n"); return 0; }

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

关键判断依据是 file 输出中的架构字段。若显示 x86-64,说明误用了主机 gcc;若显示 ARM 但目标板运行报 No such file or directory,往往是动态链接器路径不匹配,可用 arm-linux-gnueabihf-readelf -l hello | grep interpreter 查看解释器路径是否与目标板 /lib/ld-linux-armhf.so.3 一致。

二、SDK 安装与开发环境初始化

TI Processor SDK Linux 提供安装脚本,典型流程如下(以 AM335x SDK 为例,版本号以实际下载为准):

chmod +x ti-processor-sdk-linux-am335x-evm-xx.xx.xx.xx-Linux-x86-Install.bin
./ti-processor-sdk-linux-am335x-evm-xx.xx.xx.xx-Linux-x86-Install.bin
# 安装到 ~/ti-processor-sdk-linux-am335x-evm-xx.xx.xx.xx

安装后目录中通常包含 linux-devkit/(交叉工具链与 sysroot)、board-support/(U-Boot、内核源码)、filesystem/(根文件系统)、bin/(create-sdcard.sh 等脚本)。通过环境脚本把工具链加入 PATH:

cd ~/ti-processor-sdk-linux-am335x-evm-xx.xx.xx.xx
source linux-devkit/environment-setup
echo $CC
# 期望:arm-linux-gnueabihf-gcc ...

此后编译应用可直接用 $CC,SDK 会自动带上 --sysroot,保证头文件与库来自目标板根文件系统,这是避免“主机上编得过、板子上跑不起来”的关键。

三、串口与网络调试环境

串口是目标板最底层的调试通道,用于观察 U-Boot、内核启动日志和登录控制台。主机侧用 USB 转 TTL 连接目标板调试串口(Sitara 常见为 UART0,波特率 115200,8N1,无流控)。Linux 下设备名通常为 /dev/ttyUSB0,可用 minicom 或 picocom:

sudo picocom -b 115200 /dev/ttyUSB0
# 退出:Ctrl-A 再按 Ctrl-X

若出现乱码,优先检查波特率与地线;若完全无输出,检查 TX/RX 是否交叉连接。串口通了,才能看到板子到底卡在 U-Boot、内核还是根文件系统阶段。

网络调试用于文件传输与远程登录。目标板与主机需在同一网段,例如主机 192.168.1.100/24,目标板 192.168.1.50/24。常用手段:

  • ping 192.168.1.50 验证链路连通;
  • scp hello root@192.168.1.50:/home/root/ 传输文件;
  • ssh root@192.168.1.50 远程登录,替代串口做日常操作;
  • NFS 挂载根文件系统或共享目录,便于频繁迭代:mount -t nfs -o nolock 192.168.1.100:/srv/nfs /mnt。

串口与网络的分工可以这样理解:串口负责“看得见启动过程”,网络负责“传得快、登得方便”。两者都通,开发效率才真正起来。

主机(x86_64 Ubuntu)与 Sitara 目标板协同工作流 主机侧 交叉编译工具链 arm-linux-gnueabihf-gcc / $CC Processor SDK linux-devkit / sysroot / 内核源码 串口终端 picocom -b 115200 /dev/ttyUSB0 网络服务 ssh / scp / NFS 192.168.1.100 Sitara 目标板 U-Boot 串口输出启动日志 Linux 内核 加载根文件系统 根文件系统 /lib/ld-linux-armhf.so.3 应用运行 ./hello → hello sitara 串口 115200 8N1 以太网 scp / ssh / NFS 运行结果反馈 → 修改代码 → 重新交叉编译(迭代闭环)

四、主机与目标板协同工作流

把上面的工具串起来,一个可复现的日常迭代流程是:

  1. 在主机上编辑源码,用 $CC 交叉编译生成 ARM 可执行文件;
  2. 用 file 确认架构为 ARM,必要时用 readelf 检查动态链接器;
  3. 通过 scp 把文件传到目标板,或把共享目录用 NFS 挂到目标板;
  4. 在串口或 ssh 终端中运行程序,观察输出;
  5. 若失败,用串口日志定位是启动阶段、库依赖还是程序逻辑问题,回到第 1 步。

下面给出一份可直接参考的环境自检清单,用于确认链路是否搭通:

检查项命令/操作通过判据
工具链可用arm-linux-gnueabihf-gcc -dumpmachine输出 arm-linux-gnueabihf
SDK 环境source environment-setup; echo $CC输出交叉编译器路径
编译产物架构file hello显示 ARM, EABI5
串口连通picocom -b 115200 /dev/ttyUSB0可见 U-Boot/内核日志
网络连通ping 192.168.1.50有回包,无丢包
文件传输scp hello root@192.168.1.50:/home/root/传输成功
目标板运行./hello输出 hello sitara
建议把 source environment-setup 写入自己的开发 shell 启动脚本,避免每次新开终端都要重新设置;同时固定主机与目标板 IP,减少网络排查成本。
不要混用不同来源的工具链与根文件系统。若目标板根文件系统来自 SDK A,而工具链来自 SDK B,可能出现 GLIBC 版本不匹配,表现为运行时报 version 'GLIBC_2.xx' not found。此时应统一使用同一 SDK 内的工具链与文件系统。

当工具链、SDK、串口、网络四者都验证通过后,主机与目标板之间就形成了一条稳定的“编译—传输—运行—反馈”闭环。后续的内核裁剪、驱动开发、应用部署,都建立在这条链路之上。