H3518ev200 编译环境安装从放弃到入门(一)
注意事项
在根据海思官方提供的sdk文档进行安装编译环境的时候需要注意一下几点:
1. 需要注意的是有时候linux系统中进行解压的时候可能会出现错误
2. 在跟据文档提供的命令行进行安装东西的我时候,不可以直接复制命令行,需要明白每一个命令的作用和意思,比如直接复制粘贴的命令行中“-”和“—”这长短就是不一样的
3. 有时候需要那装的软件版本和官方规定的不同,这个需要灵活一点
4. 安装虚拟机的时候一定要把硬盘尽可能的放大,这次用的是40G,勉强够用,建议再大一点
5. 注意记住工具链的位置:/opt/hisi-linux/x86-arm/arm-hisiv300-linux/target/bin
说明
sdk版本:Hi3518E_SDK_V1.0.4.0和 Hi3516ev200sdk
Ubuntu安装文件:Ubuntu 20.04 64bit
1. 开发环境
1.1 基本环境
(1)虚拟机
(2)NFS服务器
(3)超级终端——SecureCRT
1.2 软件包安装
(1)配置默认使用bash
执行 sudo dpkg-reconfigure dash 选择 no
注意:Debain/Ubuntu中,/bin/sh默认指向dash,这是一个不同于bash的shell,主要为了执行脚本而出现,而不是交互,它速度快,但功能相比bash要少很多,语法严格遵循POSIX标准。
海思的SDK安装使用的是bash脚本,需要修改sh指向:此处选择no就表示使用的不是默认的dash而是bash
(2)安装软件包
sudo apt-get install make libc6 lib32z1 lib32stdc++6 zlib1g-dev libncurses5-dev ncurses-term libncursesw5-dev g++ u-boot-tools:i386 texinfo texlive gawk libssl-dev openssl bc
注意:这个命令中还缺少命令:arm-himixXXX-linux-size文件是32位的,64位的系统缺少了lib库。
执行:sudo apt install lib32z1-dev
3518ev200是32位的而3516ev200是64位的,安装32位兼容包(如果当前系统是32位则不需要):
sudo apt install lib32z1
sudo apt install lib32stdc++6
1.3 安装编译工具链
(1)解压工具链(小心解压的时候有可能出错)
工具链及其安装程序位于osdrv/opensource/toolchain/arm-hisiXXX-linux/目
录下,进入此目录进行解压,命令如下:
cd toolchain/arm-hisiXXX-linux/
tar -xvf arm-hisi300-linux.tar.bz2 此处我们选择uclibc 微型动态库 面向嵌入式Linux系统的小型的C标准库
发布包提供两种编译工具链arm-hisiv300-linux 和arm-hisiv400-linux,其中armhisiv300-linux 为基于uclibc 的工具链,arm-hisiv400-linux 为基于glibc 的工具链。
(2)安装工具链
sudo ./cross.install
1.4 安装sdk
(1)拷贝sdk:Hi3518E_SDK_V1.0.4.0
(2)解压sdk
(3)执行命令
./sdk.cleanup 清除SDK
./sdk.unpack 解压SDK
1.5 出现问题即解决办法
(1)安装软件包时出现无法定位软件包
从上面这个报错其实也知道原因了,就是在“更新源地址平台上”找不到相应的“lib32ncurses5”软件包。不到软件包通常是软件包名输入错误,或者说,没有这个软件包了,有些软件包可能会被移除或被其它的软件包替代了等等。
解决办法:安装的文件名字错误,去掉后边的:i386 重新执行安装命令
(2)/bin/sh: 1: pushd: not found 还有执行执行 ./sdk.unpack时出现not found
原因:不能压栈入栈,因为pushd命令需要在bash的环境中执行,所以需要修改系统默认shell为bash
解决办法:sudo dpkg-reconfigure dash
选择no。
2. U-boot
2.1 编译uboot
(1)配置编译环境:
make ARCH=arm CROSS_COMPILE=arm-hisiv300-linux- hi3518ev200_config
(2) 编译U-boot
make ARCH=arm CROSS_COMPILE=arm-hisiv300-linux- -j 20
编译成功后,将在 U-boot 目录下生成 u-boot.bin。
注意:这一步生成的 u-boot.bin 只是一个中间件,并不是最终在单板上执行的 U-boot 镜像
2.2 生成最终使用的u-boot镜像
U-boot 镜像生成步骤如下:
步骤 1. 完成配置表格的修改后,保存表格。
步骤 2. 单击表格第一个标签页上的按钮【Generate reg bin file】,生成临时文件 reg_info.bin。
步骤 3. 将生成的 u-boot.bin 复制到 osdrv/tools/pc/uboot_tools/目录执行命令行:mkboot.sh reg_info.bin u-boot-ok.bin
其中 u-boot-ok.bin 就是能够在单板上运行的 U-boot 镜像。
2.3问题及解决方法
(1)在生成U-boot镜像得时候mkboot.sh命令无法执行
原因:.sh文件的执行权限问题需要赋予其可执行属性 就像是chmod +x命令用来赋予执行权限一样,
sudo: ./mkboot.sh:找不到命令
解决办法:右击xxx.sh文件,打开属性———>权限——>勾选允许作为程序执行文件
退出即可
(2)在3516中通过修改配置表格后生成的reg.bin文件所生成的uboot在后来烧写中会出现错误
解决办法:通过使用另外一种方法/hiregbin 在该sdk中存在hiregbin的压缩包,阅读里面的 readme.txt文件然后按照步骤生成reg.bin文件
3. kernel
3.1配置内核
(1)手动拷贝.config 文件:
cd kernel/linux-3.4.y
cp arch/arm/configs/hi3518ev200_full_defconfig .config
(2) 用户通过“make menuconfig”进行内核配置(一般不需要改变):
make ARCH=arm CROSS_COMPILE= arm-hisiv300-linux- menuconfig
(3)保存退出
3.2 编译内核并生成内核镜像 uImage
配置保存后,可直接输入“make ARCH=arm CROSS_COMPILE=arm-hisiXXX-linux- uImage 命令编译内核生成镜像,此时需要等待几分钟。
3.3出现问题以及解决方法
(1)编译kernel出现错误
原因:由于解压kernel文件的时候出现错误
解决办法:重新解压,然后编译
4 根文件系统
4.1 根文件系统简介
Linux 的目录结构的最顶层是一个被称为“/”的根目录。系统加载Linux 内核之后,就会挂载一个设备到根目录上。存在于这个设备中的文件系统被称为根文件系统。
根文件系统通常存放于内存和Flash 中,或是基于网络的文件系统。根文件系统中存放了嵌入式系统使用的所有应用程序、库以及其他需要用到的服务。
4.2 通过busybox来制作根文件系统
(1)成功安装SDK 后,busybox 完整源代码就存放在osdrv/目录中。
(2)配置busybox
cp osdrv/busybox/busybox-1.20.2/busybox_cfg_hi3518ev200_300 osdrv/busybox/busybox-1.20.2/.config //指定配置文件
make menuconfig
注意:在Busybox Settings —> Build Options 中注意下面两个选项:
[*]Build BusyBox as a static binary (no shared libs) 是否把 busybox 编译成静态链接的可执行文件.如果选择该选项,编译出来的busybox 就是静态链接的,运行时不依赖于动态库,但体积较大;清除该选项将得到动态链接的busybox,体积较小,但需要动态库的支持。 我们可以选择静态也可以是动态,两者都可以,因为静态也不是很大。
[*] Build with Large File Support (for accessing files > 2 GB) (arm-hisiv300-linux-) Cross Compiler prefix 第二个选项是用于选择 SDK 推荐的交叉编译器
(3)编译和安装busybox:
make
make install
4.3制作根文件系统
成功安装SDK 后,在osdrv/pub/目录中存放已制作好的根文件系统。用户如有需要可在busybox 的基础上制作根文件系统。
(1)mkdir rootbox 创建一个文件以rootbox为名字的文件夹
(2)cd rootbox
(3)cp –R packet/os/busybox-1.20.2/_intsall/* . 将_install文件夹下的所有文件复制到该文件夹中
(4)mkdir etc dev lib tmp var mnt home proc 创建文件夹
注意:配置etc、lib、dev 目录的必需文件
参考链接:https://blog.csdn.net/qq_17308321/article/details/79624536
(1)etc 目录可参考系统/etc 下的文件。其中最主要的文件包括inittab、fstab、init.d/rcS文件等,这些文件最好从busybox 的examples 目录下拷贝过来,根据需要自行修改。
(2)dev 目录下的设备文件,可以直接从系统中拷贝过来或者使用mknod 命令生成需要的设备文件。拷贝文件时请使用cp –R file。也可以不写直接由系统自己生成
(3)lib 目录是存放应用程序所需要的库文件,**可以去将交叉编译链中的库文件拷贝过来/opt/hisi-linux/x86-arm/arm-hisiv300-linux/
参考链接:https://www.cnblogs.com/ganrui/p/3801619.html
出现的问题以及解决办法
参考链接:https://blog.csdn.net/kunkliu/article/details/85457706
(1)文档与sdk不一致,即在文档中hi3518ev200的配置文件是busybox_cfg_hi3518ev200_XXX 但是在具体的文件夹中没有的
原因:文档与sdk不一致
解决办法:根本上来说make menuconfig文件最后生成的就是我们知道的.config文件,所以我们可以通过查看.config文件中的内容和自己的开发板、交叉编译链进行一一比对得出能用的配置文件, 比如在选择检查工具链以及mcu的时候。学习menuconfig里的一些东西,通过menuconfig里的配置选择合适的配置文件
通过menuconfig里的东西来选择 config_v300_arm9的文件夹,是由于上图来决定的;为什么没有neon,是由mcu的特点来决定的(需要查看芯片手册来决定),显然Hi3518ev200特点决定的
参考链接:http://www.pcpop.com/article/867104_all.shtml
参考链接:https://www.jianshu.com/p/65091516bff7
概念:soft: full software floating-point support
softfp: Allows use of floating-point instructions but maintains compatibility with the soft-float ABI
hard: Uses floating-point instructions and the floating-point ABI.
neon:Neon是适用于ARM Cortex-A系列处理器的一种128位SIMD(Single Instruction, Multiple Data,单指令、多数据)扩展结构。
VFP–VFP (Vector Floating Point) technology is an FPU coprocessor extension to the ARM architecture. 除了提供浮点数基本运算(加、减、乘、除、开方、比较、取反)提供支持之外,最有特点是它向量(vectors)功能。它同时支持最多8组单精度4组[双精度浮点数]的运算。
所以综上可得,选择 config_v300_arm9的配置文件。
(2)在执行生成jffs2文件的命令之后 所生成的jffs2.img镜像文件大约4g
原因: 是因为命令输入错误导致的将 短的“-” 输成了长的“–”
解决办法:自己手打一遍命令直接生成即可
首先安装工具:sudo apt-get install mtd-utils
mkfs.jffs2 -d ./rootfs -l -e 0x10000 -o jffs2-root.img