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 20.04 LTS的ISO镜像
- 新建虚拟机,分配至少4GB内存、40GB硬盘
- 处理器核心数给2个以上,编译能快不少
- 网络选桥接模式,方便后面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 # 编译规则
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个核心就够了,给太多反而会因为资源争抢变慢。
好了,环境搭建就到这里。你跟着走一遍,应该半小时内能搞定。后面咱们就可以真正开始写代码、调试了。记住,环境搭好了,开发就成功了一半——这话真不假。