Hi3516开发笔记(三):Hi3516虚拟机基础环境搭建之交叉编译环境境搭建以及开机启动脚本分析
前言
前面进行了可以传输,那么写一个简单的C程序来交叉编译并传入运行。
虚拟机
上一篇搭建的虚拟机环境,包含了sftp传递文件,网络能ping通,基于上一篇的虚拟机继续搭建。
海思交叉编译虚拟机搭建
查看开发板提供的引导文档,先搭建ubuntu的基础软件软件,然后再解压交叉编译器搭建交叉编译的环境。
安装本机软件包
dash改为bash
Ubuntu一般默认为使用dash,我们要使用bash,所以如下:
sudo dpkg-reconfigure dash
弹出界面如下,我们选择“no”,不使用dash:

安装依赖包
直接复制命令行安装即可
sudo apt-get install make libc6:i386 lib32z1 lib32stdc++6 zlib1g-dev libncurses5-dev
sudo apt-get install ncurses-term libncursesw5-dev g++ u-boot-tools:i386 texinfo
sudo apt-get install texlive gawk libssl-dev openssl bc uuid-dev
安装完成后即可。
安装交叉编译工具(交叉编译器)
拷贝编译工具
拿到开发板海思资料中的交叉编译器,如下图:

有点大,如下图:

专门在虚拟机新建work/tools目录存放,work为存放所有代码,源码,交叉编译环境等的库地址。

传递完成:

解压安装
开发板厂家已经帮我们弄好了,所以解压,跑脚本即可。

开发板提供的安装脚本arm-himix200-linux.install的内容如下:
#!/bin/bash
TOP_DIR=/opt/hisi-linux/x86-arm
if [ -n "$1" ]
then
[ -d "$1" ] && TOP_DIR=$1
fi
TOOL_DIR=$TOP_DIR/arm-himix200-linux
TAR_BIN_DIR=$TOOL_DIR/bin
TOOLS_PKG="$PWD/arm-himix200-linux.tar.bz2"
RUNTIME_LIB_PKG="$PWD/runtime_glibc.tgz"
set +e
echo "Installing HuaWei LiteOS Linux at $TOP_DIR"
mkdir -pv $TOP_DIR
if [ -d $TOOL_DIR ]
then
echo "Delete exist directory..." >&2
rm $TOOL_DIR -rf
else
mkdir -pv $TOOL_DIR
fi
echo "Extract cross tools ..." >&2
tar -xf $TOOLS_PKG -C $TOP_DIR
# creat link
sed -i '/\/arm-hisiv610-liteOS\//d' /etc/profile
if [ -z "`grep "$TAR_BIN_DIR" < /etc/profile`" ] ;
then
echo "export path $TAR_BIN_DIR" >&2
cat >> /etc/profile << EOF
# `date`
# HuaWei LiteOS Linux, Cross-Toolchain PATH
export PATH="$TAR_BIN_DIR:\$PATH"
#
EOF
source /etc/profile
else
echo "skip export toolchains path" >&2
fi
tar -xzf $RUNTIME_LIB_PKG -C $TOOL_DIR
根据自己的习惯,先备份,然后修改如下,主要修改的几个点如下:
TOP_DIR:为工作目录
TOOL_DIR:之前tool,新建一个tools存放解压安装的
#!/bin/bash
#TOP_DIR=/opt/hisi-linux/x86-arm
TOP_DIR=/home/yang/work/tools
if [ -n "$1" ]
then
[ -d "$1" ] && TOP_DIR=$1
fi
#TOOL_DIR=$TOP_DIR/arm-himix200-linux
TOOL_DIR=$TOP_DIR/arm-himix200-linux
TAR_BIN_DIR=$TOOL_DIR/bin
TOOLS_PKG="$PWD/arm-himix200-linux.tar.bz2"
RUNTIME_LIB_PKG="$PWD/runtime_glibc.tgz"
set +e
echo "Installing HuaWei LiteOS Linux at $TOP_DIR"
mkdir -pv $TOP_DIR
if [ -d $TOOL_DIR ]
then
echo "Delete exist directory..." >&2
rm $TOOL_DIR -rf
else
mkdir -pv $TOOL_DIR
fi
echo "Extract cross tools ..." >&2
tar -xf $TOOLS_PKG -C $TOP_DIR
# creat link
sed -i '/\/arm-hisiv610-liteOS\//d' /etc/profile
if [ -z "`grep "$TAR_BIN_DIR" < /etc/profile`" ] ;
then
echo "export path $TAR_BIN_DIR" >&2
cat >> /etc/profile << EOF
# `date`
# HuaWei LiteOS Linux, Cross-Toolchain PATH
export PATH="$TAR_BIN_DIR:\$PATH"
#
EOF
source /etc/profile
else
echo "skip export toolchains path" >&2
fi
tar -xzf $RUNTIME_LIB_PKG -C $TOOL_DIR
根据自己的习惯,先备份,然后修改如下,主要修改的几个点如下:
- TOP_DIR:为工作目录
- TOOL_DIR:之前tool,新建一个tools存放解压安装的
#!/bin/bash
#TOP_DIR=/opt/hisi-linux/x86-arm
TOP_DIR=/home/yang/work/tools
if [ -n "$1" ]
then
[ -d "$1" ] && TOP_DIR=$1
fi
#TOOL_DIR=$TOP_DIR/arm-himix200-linux
TOOL_DIR=$TOP_DIR/arm-himix200-linux
TAR_BIN_DIR=$TOOL_DIR/bin
TOOLS_PKG="$PWD/arm-himix200-linux.tar.bz2"
RUNTIME_LIB_PKG="$PWD/runtime_glibc.tgz"
set +e
echo "Installing HuaWei LiteOS Linux at $TOP_DIR"
mkdir -pv $TOP_DIR
if [ -d $TOOL_DIR ]
then
echo "Delete exist directory..." >&2
rm $TOOL_DIR -rf
else
mkdir -pv $TOOL_DIR
fi
echo "Extract cross tools ..." >&2
tar -xf $TOOLS_PKG -C $TOP_DIR
# creat link
sed -i '/\/arm-hisiv610-liteOS\//d' /etc/profile
if [ -z "`grep "$TAR_BIN_DIR" < /etc/profile`" ] ;
then
echo "export path $TAR_BIN_DIR" >&2
cat >> /etc/profile << EOF
# `date`
# HuaWei LiteOS Linux, Cross-Toolchain PATH
export PATH="$TAR_BIN_DIR:\$PATH"
#
EOF
source /etc/profile
else
echo "skip export toolchains path" >&2
fi
tar -xzf $RUNTIME_LIB_PKG -C $TOOL_DIR
然后命令行安装,如下图:

然后相当漫长的等待,可以看看,此处我们打发下时间,可以先继续往下看。

Ok了,解压完成。
测试交叉编译器
交叉编译器全局引入之后,应该能调用到,实际发现arm-linux然后tab无法迁出,查看/etc/profile脚本,引入了tools/bin目录,bin目录下有对应的执行文件指向host_bin目录下,发现引入tools/arm-himix200-linux/bin无法提示出编译器,只好尝试强制引入host_bin试试,结果是可以的,如下图:
所以c++编译器好了。
测试Demo
将a.out使用sftp传入Hi3516:
然后使用命令运行查看结果:
定位开机启动文件
启动文件分布
查看开机启动应用,一般linux下的开机启动初始化都会放在/etc/init.d目录下,然后有一个rcS脚本,循环从S00到S99顺序执行,定位到目录查看如下:

- S00dev:看名称就知道是设备(不深究)

- S01udev:看名称是设备管理器,即管理设备树(不深究)

- S41dhcpcd:根据名称应该是dhcp服务(不深究)

- S50sshd:是sftp,ssh等一些服务(不深究)

- S80network:网络配置,配置动态地址,静态地址可以改这个脚本(不深究)

- rcS:主要运行的脚本,脚本中可以做一些操作,并轮询S??*系列初始化。

查看/user/qt5.12/qt-env.sh
改脚本只是引入了一些qt的环境变量。

补充:以下是另外一个环境的qt环境变量(关于显示和触摸是和具体的驱动程序相关)

查看/usr/script/hi3516dv300.sh脚本
该基本,基本是做测试用的,定位到启动开机应用:
mount /dev/mmcblk0p4 /userdata
. /userdata/user.conf
# eth0 ethernet interface config
if [ X$ETH0_CFG == Xstatic ]; then
ifconfig eth0 $BOARD_IP netmask $NETMASK broadcast $BROADCAST
elif [ X$ETH0_CFG == Xdhcp ]; then
:
else
ifconfig eth0 192.168.1.120 netmask 255.255.255.0 broadcast 192.168.1.255
fi
# telnetd start
if [ X$RUN_TELNETD == Xyes ]; then
telnetd &
fi
# openssh config
if [ X$SSHD_EN != Xyes ]; then
if [ -e /etc/init.d/S50sshd ]; then
mv /etc/init.d/S50sshd /etc/init.d/backup/
fi
else
if [ -e /etc/init.d/backup/S50sshd ]; then
mv /etc/init.d/backup/S50sshd /etc/init.d/
fi
fi
sh /userdata/user-script.sh
# mount user partition
if [ -e /dev/mmcblk0p5 ]; then
mount /dev/mmcblk0p5 /user
if [ $? != 0 ]; then
mkfs.ext4 /dev/mmcblk0p5
mount /dev/mmcblk0p5 /user
fi
fi
# start_wifi
cd /lib/
ln -s libnl-genl.so.2.0.0 libnl-genl.so.2
ln -s libnl.so.2.0.0 libnl.so.2
# load3516dv300
cd /usr/ko/
./load3516dv300 -i -sensor0 $SNS0 -sensor1 $SNS1
insmod /usr/ko/cfg80211.ko
insmod /usr/ko/8189fs.ko
# insmod touchscreen driver
if [[ -n $TOUCHSCREEN ]]; then
insmod /usr/ko/$TOUCHSCREEN lcd=$LCD debug=$TP_DEBUG
fi
# audio enable
sh /usr/script/audio-gpio.sh
# camera enable and reset
sh /usr/script/camera-gpio.sh 1
# lcd enable and reset
sh /usr/script/lcd-gpio.sh 1
# lcd backlight enable
#sh /usr/script/lcd-pwm.sh 1
# enable camera led
#sh /usr/script/ir-led.sh 1
#sh /usr/script/bl-led.sh 1
# camera preview
cd /usr/sample/vio/
#if [ X$DISPLAY == X10 ] || [ X$DISPLAY == X12 ]; then
# ./sample_vio -f $DISPLAY -t $SNS0_TYPE -T $SNS1_TYPE -l $LCD -s $SATURATION -r $SNS0_ROTATE -R $SNS1E
#elif [ X$DISPLAY == X9 ] || [ X$DISPLAY == X11 ]; then
# ./sample_vio -f $DISPLAY -t $SNS0_TYPE -l $LCD -s $SATURATION -r $SNS0_ROTATE
# ./sample_vio -f $DISPLAY -t $SNS0_TYPE -T $SNS1_TYPE -l $LCD -s $SATURATION -r $SNS0_ROTATE -R $SNS1E
#else
# ./sample_vio -f $DISPLAY -t $SNS0_TYPE
#fi
if [ X$DISPLAY == X11 ] || [ X$DISPLAY == X12 ]; then
./sample_vio -f $DISPLAY -t $SNS0_TYPE -T $SNS1_TYPE -l $LCD -s $SATURATION -r $SNS0_ROTATE -R $SNS1_ROTE
else
cd /usr/sample/ExpertCode/
/usr/sample/ExpertCode/ExpertCode_Main -l $LCD -t $SNS0_TYPE -T $SNS1_TYPE &
fi
# disable camera lcd backlight
#sh /usr/script/camera-gpio.sh 0
#sh /usr/script/lcd-gpio.sh 0
#sh /usr/script/lcd-pwm.sh 0
# disable camera led
#sh /usr/script/ir-led.sh 0
#sh /usr/script/bl-led.sh 0
echo "end of hi3516dv300.sh"
开启应用如下图:

我们注释这一部分,重启看结果:

开机后,确实没有显示。
我们打印出来,看看这句话,获取到自己跑改应用需要的一些参数,如LCD配置,-t,-T等一些参数(注意双引号)。

使用top和kill -9杀掉ExpertCode_Main进程,然后手动启动,如下图:

成功跑起来应用。
Hi3516开发笔记(三):Hi3516虚拟机基础环境搭建之交叉编译环境境搭建以及开机启动脚本分析的更多相关文章
- Hi3516开发笔记(四):Hi3516虚拟机编译uboot、kernel、roofts和userdata以及分区表
若该文为原创文章,转载请注明原文出处本文章博客地址:https://hpzwl.blog.csdn.net/article/details/121572767红胖子(红模仿)的博文大全:开发技术集合( ...
- Hi3516开发笔记(二):Hi3516虚拟机基础环境搭建之串口调试、网络连接以及sftp文件传输
前言 搭建Hi3516的基础虚拟机,为交叉编译环境搭建前期工作.后续会编译一个基本的C语言程序Demo,在HI3516上跑. 虚拟机 开发本对虚拟机做了一些基本要求,如下图: 其实重 ...
- Hi3516开发笔记(一):海思HI3516DV300芯片介绍,入手开发板以及Demo测试
前言 目前主流国产芯片为RV11XX.RK33XX.Hi35XX系列,本系列开启Hi3516系列的开发教程. Hi3516DV300芯片介绍 Hi3516DV300为专业行Smart IP ...
- Hi3516开发笔记(六):通过HiTools使用USB/串口将uboot、kernel、roofts和userdata按照分区表烧写镜像
若该文为原创文章,转载请注明原文出处本文章博客地址:https://hpzwl.blog.csdn.net/article/details/121706033红胖子(红模仿)的博文大全:开发技术集合( ...
- Django开发笔记三
Django开发笔记一 Django开发笔记二 Django开发笔记三 Django开发笔记四 Django开发笔记五 Django开发笔记六 1.基于类的方式重写登录:views.py: from ...
- 【转】64位Ubuntu 16.04搭建嵌入式交叉编译环境arm-linux-gcc过程图解
64位Ubuntu 16.04搭建嵌入式交叉编译环境arm-linux-gcc过程图解,开发裸机环境之前需要先搭建其开发环境,毕竟工欲善其事必先利其器嘛. 安装步骤 1.准备工具安装目录 下载 ar ...
- Hi3516开发笔记(十):Qt从VPSS中获取通道图像数据存储为jpg文件
前言 上一篇已经将himpp套入qt的基础上进行开发.那么qt中拿到frame则是很关键的交互,这是qt与海思可能编解码交叉开发的关键步骤. 受限制 因为直接配置sample的vi比较麻烦 ...
- SDL开发笔记(二):音频基础介绍、使用SDL播放音频
若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...
- 在win8.1 64位系统+cocos2d-x2.2.3下搭建android交叉编译环境
搭建前须要下载的软件包(默认已搭建好cocos2d-x而且可在VS上执行,本人VS版本号为2013): 1:java 下载地址:http://www.java.com/zh_CN/download/m ...
随机推荐
- B - Ancient Cipher POJ - 2159 解题报告
内容: Ancient Roman empire had a strong government system with various departments, including a secret ...
- JAVA复习总体大纲
1 java基础. [1].变量--- 数据类型 变量名=值; 数据类型: 1.基本数据类型. byte[1字节] short[2字节] int[4字节] long[8字节] float[4字节] d ...
- 【二食堂】Alpha - Scrum Meeting 2
Scrum Meeting 2 例会时间:4.11 20:00 - 20:30 进度情况 组员 今日进度 明日任务4.12不开会 李健 1. 学习并成功搭建简单的网页issue2. 学习JS基础知识i ...
- rabbitmq生产者消息确认
在使用 RabbitMQ 的时候,有时候当我们生产者发送一条消息到 RabbitMQ 服务器后,我们 生产者想知道消息是否到达了 RabbitMQ 服务器上.这个时候我们应该如何处理? 针对上述问题, ...
- HZOI帝国2019欢乐时刻
前言: update 只是恢复一下原来手残删掉的博客,不是在水,嘤嘤嘤 update 以后改成Stack,但是之前的就懒得改了... by 10.31 为了窝的访问量大家的好心情,模仿学长搞了一个这个 ...
- 2021.9.25考试总结[NOIP模拟61]
终于有点阳间题了然而挂了60pts 哈哈 T1 交通 类似简单题,限制看似很复杂,但不难发现当确定一条边是否被删后会产生裙带关系,很多边会跟着自动被确定是否被删. 仔细观察可以得出这种关系会构成偶环结 ...
- 使用Egg改造订单系统展示效果,方便快速浏览
素材准备: 1.Egg.js Born to build better enterprise frameworks and apps with Node.js & Koa 为企业级框架和应用而 ...
- 无缓存交换 牛客网 程序员面试金典 C++ Python
无缓存交换 牛客网 程序员面试金典 C++ Python 题目描述 请编写一个函数,函数内不使用任何临时变量,直接交换两个数的值. 给定一个int数组AB,其第零个元素和第一个元素为待交换的值,请返回 ...
- hdu 2999 Stone Game, Why are you always there? (简单SG,有个优化)
题意: 一排石头,个数是K. 有n个数,a1...an. 每人每次取石子只能取连续的x个.x属于a1...an的一个. 没法取者负. 思路: 简单的SG.但是TLE!后面加了一个优化~这个优化不好想到 ...
- Django settings.py设置 DEBUG=False后静态文件无法加载解决
解决办法: settings.py 文件 DEBUG = False STATIC_ROOT = os.path.join(BASE_DIR,'static') #新增 urls.py文件(项目的) ...