Hi3516开发笔记(三):Hi3516虚拟机基础环境搭建之交叉编译环境境搭建以及开机启动脚本分析

简介: 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进程,然后手动启动,如下图:

  

  成功跑起来应用。


相关文章
|
28天前
|
Ubuntu 网络安全 虚拟化
VMware虚拟机ping不通原因排查及分析
下面以 VMware 虚拟机为例进行介绍。
398 3
|
2月前
|
网络安全 虚拟化 Docker
SSH后判断当前服务器是云主机、物理机、虚拟机、docker环境
结合上述方法,您可以对当前环境进行较为准确的判断。重要的是理解每种环境的特征,并通过系统的响应进行综合分析。如果在Docker容器内,通常会有明显的环境标志和受限的资源视图;而在云主机或虚拟机上,虽然它们也可能是虚拟化的,但通常提供更接近物理机的体验,且可通过硬件标识来识别虚拟化平台。物理机则直接反映硬件真实信息,较少有虚拟化痕迹。通过这些线索,您应该能够定位到您所处的环境类型。
52 2
|
4月前
|
机器学习/深度学习 Ubuntu Linux
【机器学习 Azure Machine Learning】使用Aure虚拟机搭建Jupyter notebook环境,为Machine Learning做准备(Ubuntu 18.04,Linux)
【机器学习 Azure Machine Learning】使用Aure虚拟机搭建Jupyter notebook环境,为Machine Learning做准备(Ubuntu 18.04,Linux)
|
3月前
使用qemu来dump虚拟机的内存,然后用crash来分析
使用qemu来dump虚拟机的内存,然后用crash来分析
|
4月前
|
API 网络架构 开发者
【Azure 环境】调用Azure RunCommand 的REST API 设置虚拟机的环境变量(SetEnvironmentVariable)
【Azure 环境】调用Azure RunCommand 的REST API 设置虚拟机的环境变量(SetEnvironmentVariable)
|
4月前
|
安全 Windows
【Azure 环境】Azure 的PaaS服务如果涉及到安全漏洞问题后,我们如何确认所用服务的实例(VM:虚拟机)的操作系统已修复该补丁呢?
【Azure 环境】Azure 的PaaS服务如果涉及到安全漏洞问题后,我们如何确认所用服务的实例(VM:虚拟机)的操作系统已修复该补丁呢?
|
4月前
|
安全 网络安全
【Azure 环境】当本地网络通过ER专线与Azure云上多个虚拟网络打通,如何通过特定的网络策略来限制本地部分网段访问云上虚拟机22端口?
【Azure 环境】当本地网络通过ER专线与Azure云上多个虚拟网络打通,如何通过特定的网络策略来限制本地部分网段访问云上虚拟机22端口?
|
4月前
|
存储 API 开发工具
【Azure 环境】在Azure虚拟机(经典) 的资源中,使用SDK导出VM列表的办法
【Azure 环境】在Azure虚拟机(经典) 的资源中,使用SDK导出VM列表的办法
|
1月前
|
存储 SQL 数据库
虚拟化数据恢复—Vmware虚拟机误还原快照的数据恢复案例
虚拟化数据恢复环境: 一台虚拟机从物理机迁移到ESXI虚拟化平台,迁移完成后做了一个快照。虚拟机上运行了一个SQL Server数据库,记录了数年的数据。 ESXI虚拟化平台上有数十台虚拟机,EXSI虚拟化平台连接了一台EVA存储,所有的虚拟机都存放在EVA存储上。 虚拟化故障: 工组人员误操作将数年前迁移完成后做的快照还原了,也就意味着虚拟机状态还原到数年前,近几年数据都被删除了。 还原快照相当于删除数据,意味着部分存储空间会被释放。为了不让这部分释放的空间被重用,需要将连接到这台存储的所有虚拟机都关掉,需要将不能长时间宕机的虚拟机迁移到别的EXSI虚拟化平台上。
106 50
|
2月前
|
安全 虚拟化 数据中心
Xshell 连接 VMware虚拟机操作 截图和使用
Xshell 连接 VMware虚拟机操作 截图和使用
64 4