前言
前面進行了可以傳輸,那么寫一個簡單的C程序來交叉編譯并傳入運行。
虛擬機
上一篇搭建的虛擬機環(huán)境,包含了sftp傳遞文件,網(wǎng)絡能ping通,基于上一篇的虛擬機繼續(xù)搭建。
海思交叉編譯虛擬機搭建
查看開發(fā)板提供的引導文檔,先搭建ubuntu的基礎軟件軟件,然后再解壓交叉編譯器搭建交叉編譯的環(huán)境。
安裝本機軟件包
dash改為bash
Ubuntu一般默認為使用dash,我們要使用bash,所以如下:
sudo dpkg-reconfigure dash
彈出界面如下,我們選擇“no”,不使用dash:
安裝依賴包
直接復制命令行安裝即可
sudo apt-get install make libc6:i386 lib32z1 lib32stdc++6 zlib1g-dev libncurses5-devsudo apt-get install ncurses-term libncursesw5-dev g++ u-boot-tools:i386 texinfosudo apt-get install texlive gawk libssl-dev openssl bc uuid-dev
安裝完成后即可。
安裝交叉編譯工具(交叉編譯器)
拷貝編譯工具
拿到開發(fā)板海思資料中的交叉編譯器,如下圖:
有點大,如下圖:
專門在虛擬機新建work/tools目錄存放,work為存放所有代碼,源碼,交叉編譯環(huán)境等的庫地址。
傳遞完成:
解壓安裝
開發(fā)板廠家已經(jīng)幫我們弄好了,所以解壓,跑腳本即可。
開發(fā)板提供的安裝腳本arm-himix200-linux.install的內(nèi)容如下:
#!/bin/bashTOP_DIR=/opt/hisi-linux/x86-armif [ -n "$1" ]then [ -d "$1" ] && TOP_DIR=$1fiTOOL_DIR=$TOP_DIR/arm-himix200-linuxTAR_BIN_DIR=$TOOL_DIR/binTOOLS_PKG="$PWD/arm-himix200-linux.tar.bz2"RUNTIME_LIB_PKG="$PWD/runtime_glibc.tgz"set +eecho "Installing HuaWei LiteOS Linux at $TOP_DIR"mkdir -pv $TOP_DIRif [ -d $TOOL_DIR ]then echo "Delete exist directory..." >&2 rm $TOOL_DIR -rf else mkdir -pv $TOOL_DIRfiecho "Extract cross tools ..." >&2tar -xf $TOOLS_PKG -C $TOP_DIR# creat linksed -i ///arm-hisiv610-liteOS///d /etc/profileif [ -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 PATHexport PATH="$TAR_BIN_DIR:/$PATH" # EOF source /etc/profileelse echo "skip export toolchains path" >&2fitar -xzf $RUNTIME_LIB_PKG -C $TOOL_DIR 根據(jù)自己的習慣,先備份,然后修改如下,主要修改的幾個點如下:? TOP_DIR:為工作目錄? TOOL_DIR:之前tool,新建一個tools存放解壓安裝的#!/bin/bash#TOP_DIR=/opt/hisi-linux/x86-armTOP_DIR=/home/yang/work/toolsif [ -n "$1" ]then [ -d "$1" ] && TOP_DIR=$1fi#TOOL_DIR=$TOP_DIR/arm-himix200-linuxTOOL_DIR=$TOP_DIR/arm-himix200-linuxTAR_BIN_DIR=$TOOL_DIR/binTOOLS_PKG="$PWD/arm-himix200-linux.tar.bz2"RUNTIME_LIB_PKG="$PWD/runtime_glibc.tgz"set +eecho "Installing HuaWei LiteOS Linux at $TOP_DIR"mkdir -pv $TOP_DIRif [ -d $TOOL_DIR ]then echo "Delete exist directory..." >&2 rm $TOOL_DIR -rf else mkdir -pv $TOOL_DIRfiecho "Extract cross tools ..." >&2tar -xf $TOOLS_PKG -C $TOP_DIR# creat linksed -i ///arm-hisiv610-liteOS///d /etc/profileif [ -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 PATHexport PATH="$TAR_BIN_DIR:/$PATH" # EOF source /etc/profileelse echo "skip export toolchains path" >&2fitar -xzf $RUNTIME_LIB_PKG -C $TOOL_DIR
根據(jù)自己的習慣,先備份,然后修改如下,主要修改的幾個點如下:
- 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
然后命令行安裝,如下圖: ![在這里插入圖片描述](https://s4.51cto.com/images/blog/202111/23111117_619c5bd59cd6b11048.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=) 然后相當漫長的等待,可以看看,此處我們打發(fā)下時間,可以先繼續(xù)往下看。 ![在這里插入圖片描述](https://s4.51cto.com/images/blog/202111/23111117_619c5bd5b840c79681.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=) Ok了,解壓完成。# 測試交叉編譯器 交叉編譯器全局引入之后,應該能調(diào)用到,實際發(fā)現(xiàn)arm-linux然后tab無法遷出,查看/etc/profile腳本,引入了tools/bin目錄,bin目錄下有對應的執(zhí)行文件指向host_bin目錄下,發(fā)現(xiàn)引入tools/arm-himix200-linux/bin無法提示出編譯器,只好嘗試強制引入host_bin試試,結(jié)果是可以的,如下圖: 所以c++編譯器好了。
# 測試Demo 將a.out使用sftp傳入Hi3516: 然后使用命令運行查看結(jié)果:
# 定位開機啟動文件## 啟動文件分布 查看開機啟動應用,一般linux下的開機啟動初始化都會放在/etc/init.d目錄下,然后有一個rcS腳本,循環(huán)從S00*到S99*順序執(zhí)行,定位到目錄查看如下: ![在這里插入圖片描述](https://s4.51cto.com/images/blog/202111/23111117_619c5bd5a8cf981415.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=) - **S00dev**:看名稱就知道是設備(不深究) ![在這里插入圖片描述](https://s4.51cto.com/images/blog/202111/23111117_619c5bd5c093433762.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=) - **S01udev**:看名稱是設備管理器,即管理設備樹(不深究) ![在這里插入圖片描述](https://s4.51cto.com/images/blog/202111/23111117_619c5bd5c75a451726.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=) - **S41dhcpcd**:根據(jù)名稱應該是dhcp服務(不深究) ![在這里插入圖片描述](https://s4.51cto.com/images/blog/202111/23111117_619c5bd5e463c1505.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=) - **S50sshd**:是sftp,ssh等一些服務(不深究) ![在這里插入圖片描述](https://s4.51cto.com/images/blog/202111/23111117_619c5bd5eba0756319.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=) - **S80network**:網(wǎng)絡配置,配置動態(tài)地址,靜態(tài)地址可以改這個腳本(不深究) ![在這里插入圖片描述](https://s4.51cto.com/images/blog/202111/23111118_619c5bd60ae4f69750.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=) - **rcS**:主要運行的腳本,腳本中可以做一些操作,并輪詢S??*系列初始化。 ![在這里插入圖片描述](https://s4.51cto.com/images/blog/202111/23111118_619c5bd6114d878036.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)## 查看/user/qt5.12/qt-env.sh 改腳本只是引入了一些qt的環(huán)境變量。 ![在這里插入圖片描述](https://s4.51cto.com/images/blog/202111/23111118_619c5bd623d3b43136.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)### 補充:以下是另外一個環(huán)境的qt環(huán)境變量(關于顯示和觸摸是和具體的驅(qū)動程序相關) ![在這里插入圖片描述](https://s4.51cto.com/images/blog/202111/23111118_619c5bd6183e339263.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)## 查看/usr/script/hi3516dv300.sh腳本 該基本,基本是做測試用的,定位到啟動開機應用:```cppmount /dev/mmcblk0p4 /userdata. /userdata/user.conf# eth0 ethernet interface configif [ X$ETH0_CFG == Xstatic ]; then ifconfig eth0 $BOARD_IP netmask $NETMASK broadcast $BROADCASTelif [ X$ETH0_CFG == Xdhcp ]; then :else ifconfig eth0 192.168.1.120 netmask 255.255.255.0 broadcast 192.168.1.255fi# telnetd startif [ X$RUN_TELNETD == Xyes ]; then telnetd &fi# openssh configif [ X$SSHD_EN != Xyes ]; then if [ -e /etc/init.d/S50sshd ]; then mv /etc/init.d/S50sshd /etc/init.d/backup/ fielse if [ -e /etc/init.d/backup/S50sshd ]; then mv /etc/init.d/backup/S50sshd /etc/init.d/ fifish /userdata/user-script.sh# mount user partitionif [ -e /dev/mmcblk0p5 ]; then mount /dev/mmcblk0p5 /user if [ $? != 0 ]; then mkfs.ext4 /dev/mmcblk0p5 mount /dev/mmcblk0p5 /user fifi# start_wificd /lib/ln -s libnl-genl.so.2.0.0 libnl-genl.so.2ln -s libnl.so.2.0.0 libnl.so.2# load3516dv300cd /usr/ko/./load3516dv300 -i -sensor0 $SNS0 -sensor1 $SNS1insmod /usr/ko/cfg80211.koinsmod /usr/ko/8189fs.ko# insmod touchscreen driverif [[ -n $TOUCHSCREEN ]]; then insmod /usr/ko/$TOUCHSCREEN lcd=$LCD debug=$TP_DEBUGfi# audio enablesh /usr/script/audio-gpio.sh# camera enable and resetsh /usr/script/camera-gpio.sh 1# lcd enable and resetsh /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 previewcd /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#fiif [ 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_ROTEelse 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 0echo "end of hi3516dv300.sh"
開啟應用如下圖:
我們注釋這一部分,重啟看結(jié)果:
開機后,確實沒有顯示。
我們打印出來,看看這句話,獲取到自己跑改應用需要的一些參數(shù),如LCD配置,-t,-T等一些參數(shù)(注意雙引號)。
使用top和kill -9殺掉ExpertCode_Main進程,然后手動啟動,如下圖:
成功跑起來應用。