实战指南:Hi3519AV100开发板嵌入式Linux系统编译与烧录全流程解析
1. 环境准备与虚拟机配置
搞嵌入式开发,环境搭建是第一步,也是很多新手最容易卡住的地方。我刚开始玩Hi3519AV100开发板时,在这个阶段踩过不少坑,后来才发现其实只要注意几个关键点就能轻松搞定。
首先你得有个Linux环境,推荐用Ubuntu 18.04或20.04,这两个版本和海思工具链的兼容性最好。如果你用的是Windows系统,直接在VMware里装个Ubuntu虚拟机就行。分配资源时记得给足内存,建议至少4GB,硬盘空间留个50GB以上,毕竟编译过程中会产生大量中间文件。
装好系统后,第一件事就是更新软件源和安装基础开发工具:
sudo apt update
sudo apt upgrade
sudo apt install build-essential libncurses5-dev u-boot-tools
这些基础包装好了,后面编译时能避免很多莫名其妙的错误。我当初就因为没装全依赖,编译uboot时卡了半天才发现是缺少工具链。
虚拟机网络设置要特别注意,建议用桥接模式,这样开发板和你虚拟机就在同一个网段了,后面用tftp烧写镜像时会方便很多。共享文件夹也要设置好,方便在Windows和Linux之间传文件。
2. 交叉编译工具链部署
交叉编译工具链是嵌入式开发的核心,相当于给你的x86电脑装上一个能生成ARM代码的编译器。海思官方提供了arm-himix200-linux工具链,这个一定要配置对。
解压工具链后,别急着安装,先检查一下文件权限。有时候从Windows拷过来的文件会丢失执行权限,需要手动加上:
chmod +x arm-himix200-linux.install
运行安装脚本后,最重要的就是配置环境变量。编辑~/.bashrc文件,在最后加上:
export PATH="/opt/hisi-linux/x86-arm/arm-himix200-linux/bin:$PATH"
export ARCH=arm
export CROSS_COMPILE=arm-himix200-linux-
加完后记得source一下让配置生效。验证是否成功可以输个命令试试:
arm-himix200-linux-gcc -v
如果能看到版本信息就说明工具链配置成功了。
这里有个小技巧:建议把工具链路径也加到/etc/environment里,这样所有用户都能用到,特别是当你需要用sudo执行编译命令时。
3. U-Boot编译与定制
U-Boot相当于嵌入式系统的BIOS,负责硬件初始化和加载内核。Hi3519AV100的U-Boot编译有几个关键点要注意。
先进入SDK的uboot目录,一般路径是这样的:
cd Hi3519AV100_SDK_V2.0.2.0/osdrv/opensource/uboot
编译前要选对配置文件,不同启动介质用的配置不一样。如果是eMMC启动,就用hi3519av100_smp_emmc_defconfig。执行编译命令:
make ARCH=arm CROSS_COMPILE=arm-himix200-linux- hi3519av100_smp_emmc_defconfig
make ARCH=arm CROSS_COMPILE=arm-himix200-linux-
编译完成后会生成u-boot.bin,但这还不是最终的可烧录文件,需要用海思的mkboot工具处理一下:
./mkboot.sh reg_info.bin u-boot-hi3519av100.bin
这个reg_info.bin文件特别重要,它包含了DDR初始化参数,如果不对会导致系统无法启动。我遇到过因为用了错误的reg_info.bin文件,导致板子上电后完全没反应的情况。
网络配置是另一个容易出问题的地方。如果开发板用的PHY芯片是百兆的,需要修改include/configs/hi3519av100.h文件,把网络模式从RGMII改为RMII:
#define CONFIG_HIGMAC_PHY0_INTERFACE_MODE 1
改完后一定要重新编译,有时候make clean一下再编译更稳妥。
4. Linux内核编译技巧
内核编译比U-Boot简单些,但配置选项更多,需要根据实际硬件情况来调整。
进入kernel目录后,先选择正确的配置文件:
make ARCH=arm CROSS_COMPILE=arm-himix200-linux- hi3519av100_smp_emmc_defconfig
如果想自定义配置,可以用menuconfig界面:
make ARCH=arm CROSS_COMPILE=arm-himix200-linux- menuconfig
在这里面可以裁剪不需要的驱动和功能,让内核更精简。对于摄像头应用,要确保V4L2、ISP和视频编码相关的驱动都选上。
编译内核相对直接:
make ARCH=arm CROSS_COMPILE=arm-himix200-linux- uImage
编译完成后会在arch/arm/boot目录下生成uImage文件。这个文件已经包含了压缩的内核和uboot需要的头信息,可以直接用uboot加载。
有时候需要修改设备树文件,Hi3519AV100的设备树源文件在arch/arm/boot/dts/目录下。修改后要重新编译dtb:
make ARCH=arm CROSS_COMPILE=arm-himix200-linux- dtbs
内核版本选择也很重要,海思SDK一般会指定推荐的内核版本,不要随意升级,否则可能会导致驱动不兼容。
5. 根文件系统制作
根文件系统包含了系统运行所需的所有库、配置文件和应用程序。Hi3519AV100支持多种文件系统格式,最常用的是ext4和yaffs2。
首先需要准备一个基本的根文件系统,可以用BusyBox来构建:
make ARCH=arm CROSS_COMPILE=arm-himix200-linux- defconfig
make ARCH=arm CROSS_COMPILE=arm-himix200-linux- menuconfig
make ARCH=arm CROSS_COMPILE=arm-himix200-linux-
make ARCH=arm CROSS_COMPILE=arm-himix200-linux- install
编译安装完成后,在_install目录下就有了最基本的根文件系统。还需要手动创建一些必要的目录和文件:
mkdir proc sys dev etc etc/init.d
创建初始启动脚本etc/init.d/rcS,最简单的版本是这样的:
#!/bin/sh
mount -t proc none /proc
mount -t sysfs none /sys
/sbin/mdev -s
记得给脚本加上执行权限。接下来要根据需要添加各种库文件,从工具链的sysroot目录里拷贝相应的so文件。
制作ext4镜像时,大小设置很重要:
./make_ext4fs -l 128M -s rootfs.ext4 rootfs/
这个128M要根据实际rootfs大小来调整,太小会导致文件放不下,太大又会浪费eMMC空间。我建议先du -sh查看实际大小,再加20%余量。
6. 系统烧录与问题排查
烧录是整个流程的最后一步,也是最容易出问题的环节。Hi3519AV100支持多种烧录方式,最常用的是通过HiTool工具或者uboot的tftp命令。
如果用HiTool烧录,需要先连接好串口和网线。串口用于控制,网口用于传输数据。选择正确的芯片型号和烧录方式,一般用eMMC启动就行。
分区设置很重要,典型的布局是这样的:
| 分区名 | 起始地址 | 大小 | 内容 |
|---|---|---|---|
| boot | 0x0 | 1MB | U-Boot |
| kernel | 0x100000 | 4MB | Linux内核 |
| rootfs | 0x500000 | 剩余空间 | 根文件系统 |
如果板子上已经有uboot,可以用tftp方式烧写,这样更灵活。先设置好服务器ip和板子ip:
setenv serverip 192.168.1.100
setenv ipaddr 192.168.1.101
saveenv
然后用tftp下载镜像到内存,再写入eMMC:
tftp 0x42000000 uImage
nand erase 0x100000 0x400000
nand write 0x42000000 0x100000 0x400000
常见的烧录问题包括:网络不通、文件大小不对、分区设置错误等。如果启动时出现"Kernel panic - not syncing: VFS: Unable to mount root fs",很可能是rootfs镜像有问题或者内核配置不支持对应的文件系统。
还有个坑是DDR参数不对,会导致uboot都起不来。这种情况只能通过JTAG或者SD卡启动来恢复。建议第一次烧录前,先备份原来的系统,以防万一。
7. 实战技巧与经验分享
玩了这么久Hi3519AV100,总结出一些实用技巧。首先是编译速度问题,内核编译很耗时,可以用-j参数并行编译:
make -j8 ARCH=arm CROSS_COMPILE=arm-himix200-linux- uImage
数字8表示用8个线程,根据你的CPU核心数来调整。不过并行编译有时会出奇怪的问题,如果编译失败,先试试单线程编译。
调试时串口控制台是关键,建议把串口日志级别调高一些,方便发现问题。在uboot里设置:
setenv console ttyAMA0,115200
setenv bootargs 'console=ttyAMA0,115200 root=/dev/mmcblk0p2 rootwait'
系统跑起来后,可以用/proc和/sys文件系统查看硬件状态。比如查看CPU信息:
cat /proc/cpuinfo
查看内存使用情况:
cat /proc/meminfo
如果遇到驱动加载问题,查看dmesg输出很有帮助:
dmesg | grep error
性能优化方面,可以调整CPU频率和电压平衡功耗和性能。Hi3519AV100支持动态调频:
echo performance > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
对于视频应用,还要注意内存分配,海思平台需要预留足够的内存给视频缓冲池。一般在uboot里配置mem参数:
setenv bootargs 'mem=256M ...'
最后建议做好版本管理,每次修改配置或代码后都要记录,特别是uboot和内核的配置选项。我用git来管理整个SDK目录,这样随时可以回退到之前的版本。
这些经验都是踩过坑才总结出来的,希望能帮你少走弯路。嵌入式开发就是这样,遇到问题不要慌,耐心分析日志,一步步排查,总能解决的。
更多推荐


所有评论(0)