第二章 开发环境搭建:工欲善其事,必先利其器
做嵌入式开发,尤其是海思芯片平台,环境搭建是第一道坎。我见过太多新手,一上来就急着写代码,结果编译报错、烧录失败、调试不通,折腾半天发现是环境没配好。说实话,这步走稳了,后面能省下80%的烦恼。
这一章,我带你一步步把开发环境搭起来。包括Ubuntu虚拟机、交叉编译工具链、NFS/TFTP服务,还有串口终端。每个环节我都会说说我踩过的坑,你照着做就行。
2.1 Ubuntu虚拟机安装
为什么用虚拟机?因为海思的SDK和工具链基本都跑在Linux上。你总不能为了开发,把主力机换成Linux吧?虚拟机是最省事的方案。
我个人习惯用VMware Workstation,版本16以上就行。Ubuntu我推荐18.04或20.04 LTS。为什么?因为海思官方SDK大多基于这两个版本测试过。你装个22.04,说不定哪个库不兼容,折腾半天。
我的配置建议:
- 内存:至少8GB,推荐16GB
- 硬盘:至少100GB,推荐200GB(SDK解压后动不动几十G)
- CPU:4核以上
- 网络:桥接模式(方便NFS和TFTP)
安装过程我就不细说了,网上教程一大堆。但有两点要注意:
第一,安装时选「最小安装」。别装那些花里胡哨的办公软件,省空间。后面缺什么库,手动装就行。
第二,换国内源。这个太重要了。我记得第一次装完Ubuntu,直接apt update,等了半小时还没完。后来换成阿里源,几分钟搞定。
换源小技巧:
备份原源:sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
然后编辑:sudo vi /etc/apt/sources.list
把内容全换成阿里云的源。具体地址网上搜「Ubuntu 阿里源」就有。
2.2 交叉编译工具链配置
交叉编译,说白了就是在PC上编译出能在ARM芯片上跑的程序。海思芯片是ARM架构,你的PC是x86架构,所以需要一套特殊的工具链。
海思官方会提供工具链,一般在SDK包里的 toolchain 目录下。以Hi3516DV300为例,工具链名字大概是 arm-himix200-linux 这样的。
安装步骤其实很简单:
# 解压工具链
tar -xvf arm-himix200-linux.tar.bz2
# 进入目录
cd arm-himix200-linux
# 执行安装脚本
sudo ./arm-himix200-linux.install
# 验证是否安装成功
arm-himix200-linux-gcc --version
如果能看到版本号,说明装好了。但这里有个坑——环境变量。
安装脚本一般会自动把工具链路径加到 /etc/profile 或 /etc/bash.bashrc 里。但有时候它没加,或者加的位置不对。我曾经遇到过,明明装好了,一开新终端就找不到命令。后来发现是脚本只改了当前用户的bashrc,而我用的是zsh。
避坑指南:
安装完后,手动检查一下环境变量:
echo $PATH
看看有没有工具链的路径。如果没有,手动加到 ~/.bashrc 或 ~/.zshrc 里:
export PATH=/opt/hisi-linux/x86-arm/arm-himix200-linux/bin:$PATH
另外,我建议你写个简单的测试程序,验证工具链能不能正常工作:
// test.c
#include <stdio.h>
int main() {
printf("Hello, HiSilicon!\n");
return 0;
}
// 编译
arm-himix200-linux-gcc test.c -o test
// 查看文件信息
file test
如果输出显示 ELF 32-bit LSB executable, ARM,那就对了。说明你编译出来的是ARM架构的程序。
2.3 NFS/TFTP服务搭建
这两个服务是嵌入式开发的「快递员」。NFS用来挂载根文件系统,TFTP用来传输内核和镜像。说白了,就是让开发板和PC之间能互相传文件。
2.3.1 NFS服务
NFS(Network File System)可以把PC上的一个目录,通过网络挂载到开发板上。这样你改代码、编译,开发板那边立刻就能用上新的文件。
安装和配置:
# 安装NFS服务
sudo apt install nfs-kernel-server
# 创建共享目录
sudo mkdir -p /home/nfsroot
# 修改权限
sudo chmod 777 /home/nfsroot
# 编辑配置文件
sudo vi /etc/exports
# 添加一行(IP段根据你的网络调整)
/home/nfsroot *(rw,sync,no_root_squash,no_subtree_check)
# 重启服务
sudo systemctl restart nfs-kernel-server
配置好后,在开发板的uboot里设置启动参数,就能挂载这个目录作为根文件系统了。具体参数每个芯片不一样,但大致是:
setenv bootargs 'mem=128M console=ttyAMA0,115200 root=/dev/nfs nfsroot=192.168.1.100:/home/nfsroot rw ip=192.168.1.200:192.168.1.100:192.168.1.1:255.255.255.0::eth0:off'
经验之谈:
我刚开始用NFS时,经常遇到挂载失败。后来发现90%的原因是防火墙没关。如果你也遇到问题,先试试:
sudo ufw disable
或者检查NFS端口是否开放:rpcinfo -p
2.3.2 TFTP服务
TFTP比NFS简单得多,就是个轻量级的文件传输协议。主要用于uboot阶段下载内核和设备树。
# 安装TFTP服务
sudo apt install tftpd-hpa
# 创建TFTP目录
sudo mkdir -p /tftpboot
# 修改权限
sudo chmod 777 /tftpboot
# 编辑配置文件
sudo vi /etc/default/tftpd-hpa
# 内容如下
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/tftpboot"
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="-l -c -s"
# 重启服务
sudo systemctl restart tftpd-hpa
配置好后,把内核镜像(uImage或zImage)和设备树文件(.dtb)放到 /tftpboot 目录下。然后在开发板的uboot里:
# 设置IP
setenv serverip 192.168.1.100
setenv ipaddr 192.168.1.200
# 下载内核
tftp 0x82000000 uImage
# 下载设备树
tftp 0x83000000 hi3516dv300.dtb
# 启动
bootm 0x82000000 - 0x83000000
注意:
TFTP默认端口是69,但有些系统会占用这个端口。如果你启动服务失败,检查一下:
sudo netstat -tulpn | grep :69
如果有其他进程占用了,先停掉它。
2.4 串口终端配置
串口是嵌入式开发者的「眼睛」。没有它,你连开发板在干什么都不知道。说白了,串口就是开发板的控制台,所有调试信息、uboot交互、内核启动日志,都从串口出来。
硬件上,海思开发板一般会引出3.3V的TTL串口。你需要一个USB转串口模块,比如CH340或CP2102。连接方式很简单:
- 开发板的TX接模块的RX
- 开发板的RX接模块的TX
- GND接GND
软件上,我推荐用 minicom 或 screen。我个人习惯用minicom,因为功能更全。
# 安装minicom
sudo apt install minicom
# 配置
sudo minicom -s
# 进入配置菜单后,选择 "Serial port setup"
# 设置以下参数:
# A - Serial Device: /dev/ttyUSB0 (根据你的设备调整)
# E - Bps/Par/Bits: 115200 8N1
# F - Hardware Flow Control: No
# G - Software Flow Control: No
# 保存配置为默认
# 选择 "Save setup as dfl"
配置好后,直接运行 minicom 就能看到开发板的输出了。如果没反应,先检查一下串口设备是否存在:
ls -l /dev/ttyUSB*
如果没有,可能是驱动没装。CH340在Linux下一般免驱,但有些内核版本需要手动加载:
sudo modprobe ch341
一个小技巧:
如果你用screen,命令更简单:
screen /dev/ttyUSB0 115200
退出时按 Ctrl+A 然后按 K,再按 Y 确认。
嗯,到这里,开发环境就基本搭好了。你可能会觉得步骤有点多,但相信我,这些都是一次性工作。配好了,后面几个月甚至几年都不用再动。
下一章,我们会正式开始接触海思芯片的硬件接口。到时候,这些环境就会派上大用场了。