我用STM32MP1做了個疫情監控平臺1—交叉編譯環境搭建

0.系列教程

1.前言

之前我使用桌面版本Qt實現了肺炎疫情監控平臺:基於Qt的新冠肺炎疫情數據實時監控平臺(開源小項目)
既然Qt是跨平臺的,那麼能不能在嵌入式平臺實現一下呢?最近剛好看到,ST官方在開展創客大賽活動,就買了米爾科技的YA157C開發板移植一下。
開發板如下:

  • 開發板型號:MYD-YA157C,512MB DDR3,4GB eMMC
  • 主控芯片:STM32MP157AAC
  • 光盤資料版本:MYD-YA157C-20191225.iso
    在這裏插入圖片描述
    MYD-YA157C開發套件由核心板MYC-YA157C和底板MYB-YA157C組成,主控芯片是ST目前最高配置的MPU——STM32MP157AAC3,雙核Corte-A7+Cortex-M4,主頻最高可達650Mhz。

硬件準備

  • 12v電源適配器
  • USB-TTL模塊:115200/8/1/無
  • 網線
    在這裏插入圖片描述

開發板和主機配置

  • 開發板Linux版本:Linux 4.19.9
  • 開發板IP:192.168.1.136
  • 主機配置:Ubuntu 16.04
  • 主機IP:192.168.1.111
    在這裏插入圖片描述

2.主機搭建交叉編譯環境

所謂交叉編譯,其實是相對於本地編譯,即在一種平臺上編譯出來的程序,可以在另外一個平臺下運行,即編譯的環境和運行的環境不一樣,屬於交叉的。在進行嵌入式開發時,常常是在PC(x86架構)上使用交叉編譯工具編譯,編譯出來的可執行文件在開發板(ARM)平臺下運行。

交叉編譯工具包,位於光盤資料的03-Tools/Complie Toolchain目錄下,是一個壓縮包,直接右鍵提取,或者使用tar解壓命令都可以把壓縮包解壓。解壓完成之後有以下幾個文件:

#解壓sdk
tar xvf qt-sdk.tar.xz

#進入sdk目錄之後可以看到以下文件
meta-toolchain-qt5-openstlinux-eglfs-stm32mp1-x86_64-toolchain-2.6-snapshot.host.manifest
meta-toolchain-qt5-openstlinux-eglfs-stm32mp1-x86_64-toolchain-2.6-snapshot.sh
meta-toolchain-qt5-openstlinux-eglfs-stm32mp1-x86_64-toolchain-2.6-snapshot.target.manifest
meta-toolchain-qt5-openstlinux-eglfs-stm32mp1-x86_64-toolchain-2.6-snapshot.testdata.json

因爲後面我們會進行Qt應用的開發,所以這裏我們選擇帶Qt圖形庫支持的交叉編譯工具包

安裝交叉編譯工具包:

#切換到解壓之後的文件夾執行安裝腳本
./meta-toolchain-qt5-openstlinux-eglfs-stm32mp1-x86_64-toolchain-2.6-snapshot.sh

#按[ENTER]鍵選擇默認的安裝配置,默認安裝在/opt目錄下

在這裏插入圖片描述
來看一下是否安裝成功了:

#切換到安裝目錄
cd /opt/st/stm32mp1/2.6-snapshot/

#臨時設置環境變量
source ./environment-setup-cortexa7t2hf-neon-vfpv4-openstlinux_eglfs-linux-gnueabi
#這樣會把GCC交叉編譯器臨時添加到環境變量,退出終端失效

#查看GCC交叉編譯器版本
arm-openstlinux_eglfs-linux-gnueabi-gcc --version
#或者使用$CC --version

#輸出信息
arm-openstlinux_eglfs-linux-gnueabi-gcc (GCC) 8.2.0
Copyright (C) 2018 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

在這裏插入圖片描述
如果能輸出版本信息,就說明安裝成功了。

3.編譯第一個ARM Linux程序——Hello World

有了交叉編譯工具,和PC平臺的gcc使用方法一樣,就可以直接編譯第一個程序了。

#切換到用戶目錄
cd ~

#新建一個目錄
mkdir hello

#切換到hello目錄
cd hello

#新建一個C文件
touch hello.c

#輸入Hello World程序
vim hello.c

hello.c文件的內容:

#include <stdio.h>

int main(void)
{

    printf("Hello STM32MP1 ! -- By arm-gcc\n");
    return 0;
}

編寫完成之後,先別急着用arm-gcc編譯,先用Ubuntu自帶的gcc編譯一下,看有沒有語法錯誤,能不能正常運行。編譯這個C文件,並指定輸出文件爲pc.o

gcc hello.c -o pc.o

看一下這個文件的類型,並執行這個文件。
在這裏插入圖片描述
可以看出,沒有語法錯誤,生成了pc.o文件,這個文件是運行在x86_64架構系統上,即PC上的,而且運行結果是我們想要的。好了,程序運行沒問題,就可以使用arm-gcc來編譯這個程序,並生成可以在arm開發板上運行的可執行文件了。再使用交叉編譯工具編譯這個C程序,指定輸出arm.o文件。

$CC hello.c -o arm.o

語法沒有錯誤,生成了arm.o文件,可以通過file命令查看這個文件的信息。
在這裏插入圖片描述
因爲這個文件是運行在ARM架構的系統上的,所以在PC上不能運行,下面我們把這個文件放到開發板上去運行。

4.在開發板上運行Hello World程序

怎麼能在開發板上運行這個程序呢?也就是怎麼能把這個文件傳輸到開發板上呢?

4.1 U盤拷貝

這恐怕是最簡單的方法了。把生成的arm.o文件複製到U盤裏,把U盤插到板子上的USB接口,並掛載到mnt目錄

#查看當前的設備
ls /dev/sda*

#掛載U盤到mnt目錄
mount /dev/sda /mnt

#如果沒有掛載成功,嘗試掛載另外一個設備
mount /dev/sda4 /mnt

#掛載成功之後切換到mnt目錄
cd /mnt

#運行arm.o
./arm.o

實際運行:
在這裏插入圖片描述
同樣取消掛載:

#先退出/mnt目錄
cd ~

#取消掛載
umount /mnt

在這裏插入圖片描述
這種方式有點麻煩,我們來使用另外一種方法。

4.2 scp文件傳輸

在使用交叉編譯工具鏈,編譯出arm.o文件時,我們是通過拷貝到U盤,然後把U盤插到開發板上來運行程序的,但是這樣未免太麻煩了。

那麼有沒有一種簡單的方式,可以在PC Ubuntu主機和開發板快速方便的進行文件傳輸呢?其實有很多種方法,nfs,ftp,tftp等等,這裏我們使用一種最簡單的方式:scp命令。

scp命令是基於物理網口的,在進行傳輸之前,需要確定開發板和PC主機是可以正常通信的。開發板和電腦使用網線連接,或者開發板連接路由器,電腦連路由器的WiFi,這兩種方式都是可以的。

  • 開發板配置eth0網口IP地址:
ifconfig eth0 192.168.1.136 up

在這裏插入圖片描述

  • 主機配置IP地址

通過有線連接選項,手動配置IPv4地址
在這裏插入圖片描述

開發板和主機互相ping,測試網絡是否正常。

在這裏插入圖片描述

這樣就說明是正常的。把PC主機上的arm.o文件傳輸到開發板上:

scp ~/arm.o [email protected]:/root

如果出現如下錯誤:
在這裏插入圖片描述
只需要執行一下提示的那一行命令就行了:

ssh-keygen -f "/home/whik/.ssh/known_hosts" -R 192.168.1.136

如果還是報錯:
在這裏插入圖片描述那就把knows_host文件刪除了

rm ~/.ssh/know_hosts

再執行scp命令:
在這裏插入圖片描述
先輸入yes,下面會顯示傳輸的進度。

到開發板上看一下:
在這裏插入圖片描述
可以看到,和PC上的運行結果是一樣的。

關於scp的其他用法:

#複製本地文件到遠程文件夾
scp local_file remote_username@remote_ip:remote_folder 

#複製本地文件到遠程文件
scp local_file remote_username@remote_ip:remote_file 

#複製整個目錄及其子文件
scp -r local_folder remote_username@remote_ip:remote_folder 

從遠程複製到本地,只要將從本地複製到遠程的命令的後2個參數調換順序即可。

  • 1.如果遠程服務器防火牆有爲scp命令設置了指定的端口,我們需要使用 -P 參數來設置命令的端口號。命令格式如下:
#scp 命令使用端口號 4588
scp -P 4588 [email protected]:/usr/local/sin.sh /home/administrator
  • 2.使用scp命令要確保使用的用戶具有可讀取遠程服務器相應文件的權限,否則scp命令是無法起作用的。

4.3 tftp文件傳輸

另一種文件傳輸方式,比scp麻煩一些,先在主機配置tftp服務器,並配置共享目錄,然後就可以開始文件傳輸了。

#主機安裝tftp服務器
sudo apt-get install tftpd-hpa

#創建共享目錄
mkdir ftp

#修改目錄權限
chmod 777 ftp

#在配置文件中添加共享目錄
sudo vim /etc/default/tftp-hpa

#添加共享文件夾
TFTP_DIRECTORY="/home/whik/ya157c/ftp"                                         

#啓動tftp服務器
sudo service tftpd-hpa restart

在這裏插入圖片描述

開發板獲取主機192.168.1.111上共享目錄下的a.cpp文件,並重新命名爲b.cpp保存到本地

#把遠程的a.cpp文件保存到本地b.cpp
tftp 192.168.1.111 -g -r a.cpp -l b.cpp

#把遠程的a.cpp保存到本地,不重命名
tftp 192.168.1.111 -g -r a.cpp

在這裏插入圖片描述

參數說明:

-g 表示下載文件(get)
-p 表示上傳文件(put)
-l 表示本地文件名(local file)
-r 表示遠程主機的文件名(remote file)

5.ssh登錄開發板

如果scp和tftp都可以正常傳輸,我們還可以使用ssh命令登錄開發板,和串口登錄是一樣的。

ssh [email protected]

在這裏插入圖片描述

6.注意

如果遇到無法正常安裝程序,請嘗試安裝以下程序。

#更新源
sudo apt-get update
sudo apt-get upgrade

#安裝所需要的軟件
sudo apt-get install libusb-1.0-0

sudo apt-get install bison flex sed wget curl cvs subversion git-core
coreutils unzip texi2html texinfo docbook-utils gawk python-pysqlite2 diffstat
help2man make gcc build-essential g++ desktop-file-utils chrpath libxml2-utils
xmlto docbook bsdmainutils iputils-ping cpio python-wand python-pycryptopp
python-crypto

sudo apt-get install libsdl1.2-dev xterm corkscrew nfs-common nfs-kernel-
server device-tree-compiler mercurial u-boot-tools libarchive-zip-perl

sudo apt-get install ncurses-dev bc linux-headers-generic gcc-multilib
libncurses5-dev libncursesw5-dev lrzsz dos2unix lib32ncurses5 repo libssl-dev

7.shell腳本點燈

簡單寫一個shell腳本閃個燈,沒什麼技術含量,led_blink.sh文件內容:

#!/bin/bash

echo none > /sys/class/leds/heartbeat/trigger

#死循環
while true
do
    echo 0 > /sys/class/leds/heartbeat/brightness
    echo "點亮"
    sleep 0.1
    echo 1 > /sys/class/leds/heartbeat/brightness
    sleep 0.1
    echo "熄滅"
done

在開發板上運行

#scp傳輸
scp led_blink.sh [email protected]:/home/root

#開發板給這個腳本添加可執行權限
chmod +x led_blink.sh

#開發板執行這個腳本
./led_blink.sh

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章