2、开发环境搭建:交叉编译工具链、SDK安装、NFS与TFTP配置
好,咱们正式开始动手了。这一章我带你把开发环境搭起来。说实话,环境搭建这事儿,看着简单,但坑不少。我在海思项目上见过太多人卡在这一步,一卡就是半天。咱们今天把这几个关键环节捋清楚。
2.1 交叉编译工具链安装
为什么要用交叉编译?说白了,你的PC是x86架构,海思芯片是ARM架构。PC上编译出来的程序,ARM芯片跑不了。所以我们需要一套工具,在PC上编译出ARM能跑的程序——这就是交叉编译工具链。
海思官方提供的工具链,我建议直接用。别自己折腾什么Linaro版本,兼容性问题会让你怀疑人生。
官方工具链获取路径:一般在SDK包里的 toolchain/ 目录下。文件名类似 arm-himix200-linux.tgz。
安装步骤其实就四步:
- 解压工具链包
- 运行安装脚本
- 配置环境变量
- 验证安装结果
具体操作看这里:
# 解压
tar -xzf arm-himix200-linux.tgz
# 进入目录,运行安装脚本
cd arm-himix200-linux
sudo ./arm-himix200-linux.install
# 安装完成后,工具链默认在 /opt/hisi-linux/x86-arm/ 下
# 配置环境变量(建议写到 ~/.bashrc 里)
export PATH=/opt/hisi-linux/x86-arm/arm-himix200-linux/bin:$PATH
# 验证
arm-himix200-linux-gcc --version
嗯,这里要注意。环境变量一定要配对。我曾经见过一个同事,配了路径但没source,编译时一直报“命令找不到”,急得满头大汗。你配完后记得 source ~/.bashrc 或者重新开一个终端。
我的习惯:我会在 /etc/profile.d/ 下单独建一个 hisi_env.sh 文件,把工具链路径写进去。这样所有用户都能用,重启也不会丢。
2.2 SDK安装与目录结构
SDK安装其实更简单。海思的SDK一般是一个 .tgz 包,解压后运行一个脚本就行。但我想跟你聊聊SDK的目录结构——这个搞清楚了,后面开发会顺手很多。
解压SDK:
tar -xzf Hi3516CV500_SDK_Vx.x.x.x.tgz
cd Hi3516CV500_SDK_Vx.x.x.x
source ./sdk.cleanup
source ./sdk.unpack
运行完 sdk.unpack 后,你会看到这样的目录结构:
| 目录名 | 说明 |
|---|---|
osdrv/ |
内核、uboot、文件系统源码 |
mpp/ |
视频处理核心库,这是咱们课程的重点 |
smp/ |
安全媒体处理相关 |
drv/ |
外设驱动源码 |
tools/ |
烧录工具、调试工具等 |
doc/ |
开发文档,这个一定要看 |
我个人习惯,拿到SDK后第一件事不是编译,而是先看 doc/ 目录下的《Release Notes》和《快速入门指南》。里面会写明当前版本有哪些已知问题、依赖哪些补丁。你想想看,如果不知道这些,后面踩坑了都不知道怎么死的。
注意:SDK解压后,不要放在中文路径下。海思的编译脚本对中文支持不好,我曾经吃过这个亏,编译到一半报错,查了半天才发现是路径里有中文。
2.3 NFS服务配置
NFS是开发阶段最常用的文件传输方式。为什么?因为开发板上存储空间有限,你总不能每次改个代码都重新烧录吧?NFS挂载后,开发板直接访问PC上的文件,改完就能跑,效率高得多。
配置NFS服务端(你的Ubuntu PC):
# 安装NFS服务
sudo apt-get install nfs-kernel-server
# 创建共享目录
sudo mkdir -p /home/nfsroot
sudo chmod 777 /home/nfsroot
# 编辑配置文件
sudo vim /etc/exports
# 添加一行:
/home/nfsroot *(rw,sync,no_root_squash,no_subtree_check)
# 重启服务
sudo /etc/init.d/nfs-kernel-server restart
# 验证
showmount -e localhost
开发板上怎么挂载?进入uboot或者系统启动后,执行:
mount -t nfs -o nolock 192.168.1.100:/home/nfsroot /mnt
这里的 192.168.1.100 是你PC的IP地址。记得把开发板和PC设在同一网段。
避坑指南:我曾经遇到过NFS挂载后,开发板写入文件时权限报错。原因是 /etc/exports 里忘了加 no_root_squash。加上就好了,这个参数的意思是:允许开发板的root用户拥有和PC的root一样的权限。
2.4 TFTP服务配置
TFTP主要用于uboot阶段加载内核和设备树。说白了,就是开发板还没启动Linux时,通过uboot从PC上下载文件。
配置TFTP服务端:
# 安装TFTP服务
sudo apt-get install tftpd-hpa
# 创建TFTP根目录
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"
# 重启服务
sudo /etc/init.d/tftpd-hpa restart
# 验证
# 在/tftpboot下放一个测试文件,然后在另一台机器上:
tftp 192.168.1.100
tftp> get testfile
tftp> quit
uboot中怎么用?进入uboot命令行后:
# 设置开发板IP
setenv ipaddr 192.168.1.10
# 设置服务器IP
setenv serverip 192.168.1.100
# 下载内核
tftp 0x82000000 uImage
# 下载设备树
tftp 0x83000000 hi3516cv500.dtb
# 启动
bootm 0x82000000 - 0x83000000
注意:TFTP默认端口是69,有些防火墙会拦截。如果你发现 tftp 命令一直超时,先检查防火墙:sudo ufw status。如果开着,要么关掉,要么开放69端口。
2.5 环境验证
所有配置完成后,我建议你做一个完整的验证流程。别等到写代码了才发现环境有问题。
验证步骤:
- 交叉编译一个简单的Hello World程序
- 通过NFS或TFTP传到开发板
- 在开发板上运行
Hello World示例:
// hello.c
#include <stdio.h>
int main() {
printf("Hello, Hi3516!\n");
return 0;
}
# 交叉编译
arm-himix200-linux-gcc -o hello hello.c
# 查看文件类型,确认是ARM架构
file hello
# 输出应该包含:ELF 32-bit LSB executable, ARM
把这个 hello 文件放到NFS共享目录或TFTP根目录,然后在开发板上执行。如果能正常打印出“Hello, Hi3516!”,恭喜你,环境搭建成功了。
总结一下:工具链是编译工具,SDK是开发资源包,NFS是开发阶段的文件共享通道,TFTP是uboot阶段的文件下载通道。这四个东西配合好了,后面的开发才会顺畅。
嗯,环境搭建这部分就这些。下一章咱们开始真正接触海思的视频处理架构——VI、VPSS、VENC这些模块。到时候我会结合一个实际的视频采集编码流程来讲,你准备好了吗?