2、开发环境搭建:安装Ubuntu虚拟机、配置TFTP/NFS服务、安装交叉编译工具链、搭建SDK环境

说实话,做嵌入式Linux开发,环境搭建这一步最容易被忽视。很多人急着写代码,结果编译都过不了,白白浪费一整天。我刚开始搞Sitara的时候也踩过这个坑——装了个半吊子环境,调试时发现文件传不过去,气得想砸电脑。

今天咱们就把这套环境彻底搞定。你跟着我走一遍,保证后面开发顺风顺水。

2.1 安装Ubuntu虚拟机

我个人习惯用VMware Workstation,当然VirtualBox也行。但要注意,Sitara的SDK对Ubuntu版本有要求——我建议用Ubuntu 18.04 LTS或20.04 LTS。为什么?因为TI官方SDK在这两个版本上测试最充分。

注意: 别用Ubuntu 22.04!我去年试过一次,交叉编译工具链的依赖库版本对不上,折腾了两天才搞定。除非你特别熟悉库版本管理,否则老老实实用18.04或20.04。

安装步骤其实很简单:

  1. 下载Ubuntu 20.04 LTS的ISO镜像
  2. 新建虚拟机,分配至少4GB内存、40GB硬盘
  3. 处理器核心数给2个以上,编译能快不少
  4. 网络选桥接模式,方便后面NFS和TFTP通信

装好之后,记得先跑一遍sudo apt update && sudo apt upgrade。嗯,这一步别省,我见过有人跳过这步,结果装工具链时缺了一堆依赖。

2.2 配置TFTP服务

TFTP这玩意儿,说白了就是个极简的文件传输协议。开发时用来把内核、设备树、根文件系统快速传到开发板上。我项目中经常用它来调试内核——改一行代码,编译完直接tftp下载,比烧写SD卡快多了。

安装和配置:

sudo apt install tftpd-hpa
sudo mkdir -p /tftpboot
sudo chmod 777 /tftpboot

然后编辑配置文件:

sudo vim /etc/default/tftpd-hpa

改成这样:

TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/tftpboot"
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="-l -c -s"
小技巧: -c参数允许创建新文件,这样你可以在开发板上通过tftp上传日志文件回来分析。我曾经靠这个功能远程定位了一个内存泄漏问题,省了跑一趟实验室。

重启服务:

sudo systemctl restart tftpd-hpa

测试一下:在/tftpboot里放个文件,然后在开发板上用tftp 你的虚拟机IP -g -r 文件名下载。能成功就说明配好了。

2.3 配置NFS服务

NFS比TFTP高级一点——它能把开发板上的目录直接挂载到虚拟机里。调试应用程序时特别爽:在Ubuntu里编译完,开发板上立刻就能用,不用反复拷贝。

安装NFS服务器:

sudo apt install nfs-kernel-server
sudo mkdir -p /nfsroot
sudo chmod 777 /nfsroot

编辑导出文件:

sudo vim /etc/exports

添加一行:

/nfsroot *(rw,sync,no_subtree_check,no_root_squash)
注意: no_root_squash这个参数很重要。不加的话,开发板上root用户访问文件会被映射成nobody,权限问题会让你怀疑人生。我刚开始就栽在这上面,调试了整整一个下午。

重启NFS服务:

sudo exportfs -a
sudo systemctl restart nfs-kernel-server

测试方法:在开发板上执行mount -t nfs 你的虚拟机IP:/nfsroot /mnt,能挂载成功就OK了。

2.4 安装交叉编译工具链

交叉编译,说白了就是在PC上编译出ARM架构能运行的代码。Sitara处理器是ARM Cortex-A系列,所以咱们用gcc-arm-linux-gnueabihf

安装方式有两种:

方式 命令 说明
apt安装(推荐) sudo apt install gcc-arm-linux-gnueabihf 简单,版本较老但稳定
Linaro工具链 从linaro.org下载 版本新,优化更好

我个人习惯用apt安装,省事。但如果你需要最新的特性,比如C17标准支持,那就去Linaro官网下载。

验证安装:

arm-linux-gnueabihf-gcc --version

看到版本号就说明装好了。写个Hello World试试:

#include <stdio.h>
int main() {
    printf("Hello Sitara!\n");
    return 0;
}
arm-linux-gnueabihf-gcc -o hello hello.c
file hello

输出应该是ELF 32-bit LSB executable, ARM,这就对了。

2.5 搭建SDK环境

TI的SDK(Processor SDK Linux)是开发Sitara的核心。它包含了内核源码、U-Boot、文件系统生成工具、示例代码等等。

下载地址:TI官网搜索"Processor SDK Linux for AM335x"(根据你的具体型号选择)。

安装步骤:

chmod +x ti-processor-sdk-linux-am335x-evm-xx.xx.xx.xx.bin
./ti-processor-sdk-linux-am335x-evm-xx.xx.xx.xx.bin

它会解压到一个目录,比如~/ti-processor-sdk-linux-am335x-evm-08.02.00.24

目录结构大概是这样:

├── bin          # 工具脚本
├── board-support # 板级支持包
├── docs         # 文档
├── example-applications # 示例应用
├── filesystem   # 根文件系统
├── linux-devkit # 开发套件
└── rules.make   # 编译规则
重点: SDK里自带了交叉编译工具链,就在linux-devkit/sysroots/x86_64-arago-linux/usr/bin下。如果你用SDK自带的工具链,可以跳过2.4节。但我建议还是单独装一份,因为有时候SDK版本更新,工具链路径会变。

设置环境变量:

export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabihf-
export TI_SDK_PATH=~/ti-processor-sdk-linux-am335x-evm-08.02.00.24

把这些加到~/.bashrc里,免得每次都要手动敲。

2.6 验证环境

环境搭好了,咱们验证一下。编译一个最简单的内核模块:

cd $TI_SDK_PATH/board-support/linux-*
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- omap2plus_defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage -j4

如果编译通过,说明整个环境都通了。我第一次编译内核时等了大概10分钟,看到Kernel: arch/arm/boot/zImage is ready那行字,心里踏实多了。

我的经验: 编译内核时加-j4(4线程)能快不少。但别贪心,虚拟机里给2-4个核心就够了,给太多反而会因为资源争抢变慢。

好了,环境搭建就到这里。你跟着走一遍,应该半小时内能搞定。后面咱们就可以真正开始写代码、调试了。记住,环境搭好了,开发就成功了一半——这话真不假。