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。
串口与网络的分工可以这样理解:串口负责“看得见启动过程”,网络负责“传得快、登得方便”。两者都通,开发效率才真正起来。
四、主机与目标板协同工作流
把上面的工具串起来,一个可复现的日常迭代流程是:
- 在主机上编辑源码,用
$CC交叉编译生成 ARM 可执行文件; - 用
file确认架构为 ARM,必要时用readelf检查动态链接器; - 通过
scp把文件传到目标板,或把共享目录用 NFS 挂到目标板; - 在串口或 ssh 终端中运行程序,观察输出;
- 若失败,用串口日志定位是启动阶段、库依赖还是程序逻辑问题,回到第 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,减少网络排查成本。version 'GLIBC_2.xx' not found。此时应统一使用同一 SDK 内的工具链与文件系统。当工具链、SDK、串口、网络四者都验证通过后,主机与目标板之间就形成了一条稳定的“编译—传输—运行—反馈”闭环。后续的内核裁剪、驱动开发、应用部署,都建立在这条链路之上。