第二章:开发环境搭建

说实话,搭建开发环境这件事,看着简单,但坑是真不少。我见过太多人卡在这一步,明明板子都到手了,就是跑不起来。今天我就把这几年的经验捋一捋,带你把这关过了。

2.1 Ubuntu交叉编译环境配置

交叉编译,说白了就是在PC上编译出能在海思芯片上跑的程序。为什么要这么麻烦?因为海思芯片是ARM架构,而你的电脑是x86架构,两者不兼容。

我个人习惯用Ubuntu 18.04或20.04 LTS版本。为什么?因为海思官方SDK对这两个版本支持最好。我曾经试过用Ubuntu 22.04,结果编译时各种库版本冲突,折腾了两天才搞定。

核心步骤:

  1. 安装交叉编译工具链
  2. 配置环境变量
  3. 验证编译环境

先下载海思官方提供的交叉编译工具链,一般是 arm-himix200-linux.tar.bz2 这样的包。解压到 /opt 目录下:

sudo tar -xvf arm-himix200-linux.tar.bz2 -C /opt/

然后配置环境变量。我建议你直接写到 ~/.bashrc 里,省得每次都要手动设置:

export PATH=/opt/arm-himix200-linux/bin:$PATH
export CROSS_COMPILE=arm-himix200-linux-
export ARCH=arm

嗯,这里要注意:CROSS_COMPILE 这个变量名不能写错,很多Makefile就是靠它来找到编译器的。

验证一下是否配置成功:

arm-himix200-linux-gcc --version

如果能看到版本信息,说明环境搭好了。我曾经遇到一个坑:明明装了工具链,但就是找不到命令。后来发现是64位系统缺少32位库,执行 sudo apt-get install lib32z1 lib32ncurses5 就解决了。

2.2 HiTool烧录工具使用

HiTool是海思官方提供的烧录工具,说白了就是把编译好的固件写到板子的Flash里。我第一次用的时候,差点把板子烧成砖——还好只是虚惊一场。

工具界面是图形化的,但有几个关键点你得注意:

参数 推荐值 说明
传输方式 USB 串口太慢,网口有时不稳定
烧录地址 0x100000 根据你的Flash大小调整
烧录文件 u-boot.bin 先烧uboot,再烧内核和文件系统

警告:烧录前一定要确认板子的启动模式跳线是否正确。我见过有人把启动模式设成了SPI Flash,结果烧到NAND Flash里,板子直接变砖。

操作流程其实很简单:

  1. 板子上电前,按住烧录键(一般是板子上的某个按键)
  2. 上电,HiTool会检测到设备
  3. 选择烧录文件,点击开始
  4. 等待进度条走完,断电重启

我个人习惯是先烧uboot,然后通过uboot的网络功能烧内核和文件系统。这样万一烧错了,还能通过uboot救回来。

2.3 SDK目录结构解析

海思的SDK目录结构,第一次看确实有点懵。我刚开始做项目时,光找头文件就找了半天。这里我帮你捋一捋:

Hi3516DV300_SDK_V1.0.0/
├── package/          # 编译好的固件包
├── osdrv/            # 操作系统驱动
│   ├── kernel/       # Linux内核源码
│   ├── rootfs/       # 根文件系统
│   └── tools/        # 编译工具
├── mpp/              # 媒体处理平台
│   ├── include/      # 头文件(重点)
│   ├── lib/          # 库文件
│   └── sample/       # 示例代码
├── drv/              # 外设驱动
└── doc/              # 文档

你想想看,最常用的是哪个目录?没错,就是 mpp/ 目录。这里包含了视频编解码、图像处理、音频处理等核心API。我建议你先把 mpp/sample/ 里的示例代码跑一遍,能快速上手。

小技巧:编译自己的程序时,记得把 mpp/include/ 加到头文件搜索路径,把 mpp/lib/ 加到库文件搜索路径。我一般会在Makefile里这样写:

CFLAGS += -I$(SDK_PATH)/mpp/include
LDFLAGS += -L$(SDK_PATH)/mpp/lib -lmpi

2.4 网络配置与SSH调试

板子跑起来后,总不能每次都插串口线吧?SSH才是王道。但前提是网络要配好。

海思板子默认的IP是 192.168.1.10,但你的电脑可能不在这个网段。我建议你手动配置:

# 在板子的uboot中设置
setenv ipaddr 192.168.1.100
setenv serverip 192.168.1.10
setenv gatewayip 192.168.1.1
saveenv

然后重启板子,用网线直连电脑。把电脑的IP也设成同一网段,比如 192.168.1.10。试试能不能ping通:

ping 192.168.1.100

通了?好,接下来配置SSH。海思的rootfs默认可能没装SSH服务,需要自己编译进去。我一般用dropbear,轻量级,适合嵌入式设备:

# 在板子上执行
dropbear -R -p 22

然后从电脑上SSH连接:

ssh root@192.168.1.100

注意:默认密码一般是 rootadmin。如果连不上,检查一下板子的防火墙——没错,嵌入式Linux也有iptables。我曾经被这个坑过,折腾了一下午才发现是防火墙把SSH端口给拦了。

SSH连上之后,你就可以用scp传文件了。我个人习惯用 rsync 同步代码,增量传输,省时间:

rsync -avz --progress ./my_project/ root@192.168.1.100:/home/root/

嗯,到这里开发环境就基本搭好了。你可能会问:为什么不用NFS挂载?当然可以,但那是进阶玩法,等基础环境跑通了再说。

最后提醒一句:每次修改网络配置后,记得 saveenv 保存到Flash,不然断电就丢了。这个教训,我可是用两块板子换来的。