iMX287A交叉編譯環境搭建

@

1.開發套件簡介

  • 開發板:EasyARM-i.MX287A
  • 液晶屏:4.3寸TFT液晶,4線電阻觸摸,分辨率480 × 272。
  • 光盤資料版本:EasyARM-i.MX28xA_V1.05.iso
    在這里插入圖片描述

2.說明:

2.1 開發板配置

  • 型號:EasyARM-i.MX287A
  • 系統:Linux version 2.6.35.3 gcc 4.4.4
  • IP地址:192.168.1.136
    在這里插入圖片描述

2.2 主機配置

  • 系統:Linux主機,如Ubuntu 16.04
  • IP地址:192.168.1.111

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

交叉編譯器是在PC上運行的編譯器,但是編譯后得到的二進制程序卻不能在PC
上運行,而只能在開發板上運行。交叉編譯器命名方式一般遵循“處理器-系統-gcc”這樣的
規則,一般通過名稱便可以知道交叉編譯器的功能。

例如下列交叉編譯器:

  • arm-none-eabi-gcc,表示目標處理器是 ARM,不運行操作系統,僅運行前后臺程序;
  • arm-uclinuxeabi-gcc,表示目標處理器是 ARM,運行 uClinux 操作系統;
  • arm-none-linux-gnueabi-gcc,表示目標處理器是 ARM,運行 Linux 操作系統;
  • mips-linux-gnu-gcc,表示目標處理器是 MIPS,運行 Linux 操作系統。

進行 ARM Linux 開發,通常選擇 arm-linux-gcc 交叉編譯器。ARM-Linux 交叉編譯器可以自行從源代碼編譯,也可以從第三方獲取。在能從第三方獲取交叉編譯器的情況下,請盡量采用第三方編譯器而不要自行編譯,一是編譯過程繁瑣,不能保證成功,二是就算編譯成功,也不能保證交叉編譯器的穩定性,編譯器的不穩定性會對后續的開發帶來無限隱患。而第三方提供的交叉編譯器通常都經過比較完善的測試,確認是穩定可靠的。

交叉編譯器光盤路徑:
EasyARM-i.MX28xA_V1.05/3、Linux/2、工具軟件/Linux工具軟件/gcc-4.4.4-glibc-2.11.1-multilib-1.0_EasyARM-iMX283.tar.bz2

主機只需要把這個文件解壓到/opt目錄下,就完成了交叉編譯器的安裝。
tar xjvf gcc-4.4.4-glibc-2.11.1-multilib-1.0.tar.bz2 -C /opt/

-C:指定解壓路徑,不指定則默認解壓到當前目錄

解壓完成之后,交叉編譯工具鏈,即gcc/g++/gdb等工具的路徑在
/opt/gcc-4.4.4-glibc-2.11.1-multilib-1.0/arm-fsl-linux-gnueabi/bin目錄下
在這里插入圖片描述

在安裝交叉編譯器之后,還需要先安裝32 位的兼容庫和 libncurses5-dev 庫:

sudo apt-get install ia32-libs
sudo apt-get install libncurses5-dev

若 Linux 主機系統沒有安裝 32 位兼容庫,在使用交叉編譯工具的時候可能會出現錯誤:

arm-fsl-linux-gnueabi-gcc: 沒有那個文件或目錄

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

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

cd ~:切換到用戶目錄
touch hello.c:新建一個c文件
vi hello.c:輸入C程序,當然也可以使用vim/gedit

#include "stdio.h"

int main(void)
{
    printf("Hello World! -- 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文件。

/opt/gcc-4.4.4-glibc-2.11.1-multilib-1.0/arm-fsl-linux-gnueabi/bin/arm-fsl-linux-gnueabi-gcc hello.c -o arm.o

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

5.開發板運行U盤中的可執行文件

把arm.o文件拷貝到U盤中,并把U盤插到開發板的USB接口。

開發板上電,連接上串口終端,Ubuntu下的串口工具很多,minicom/putty/picocom等等。我使用的是picocom,指定波特率115200和串口號:

sudo picocom -b 115200 /dev/ttyUSB0

開發板Linux系統用戶名和密碼都是root

登錄進去之后,U盤默認掛載在media目錄下。
在這里插入圖片描述
可以看到,程序運行正常。至此,一個簡單的hello world程序就完成了。

6.配置交叉編譯工具到環境變量

在進行交叉編譯時,我們是使用的絕對路徑來編譯C程序,但是這個路徑太長了,每次輸入很麻煩。
那么能不能像Windows那樣,把交叉編譯工具所在的路徑添加到PATH環境變量呢?當然是可以的。

6.1 環境變量配置的幾種方式

注意:以下涉及到文件修改的地方,需要先執行mount -o remount rw /把文件系統掛載為可讀寫,否則不能保存,因為板子默認所有的文件都是只讀的。

Ubuntu配置環境變量主要以下幾種方式:

  • export臨時設置

以下這兩種方式都是可以的,可以在終端直接執行,執行完成之后立即生效,但只在當前終端有效,退出終端自動失效。

#路徑添加在最后面
export PATH=$PATH:/要添加的路徑

#路徑添加在最前面
export PATH=/要添加的路徑:$PATH
  • 修改用戶配置文件bashrc

推薦使用這種方式,修改~/.bashrc文件只對當前用戶有效,而不影響其他用戶的配置文件。

#執行如下命令,編輯bashrc文件
sudo vi ~/.bashrc

#在文件最后添加一行
export PATH=$PATH:/要添加的路徑

#保存之后soure命令使修改立即生效
source ~/.bashrc
  • 修改全局配置文件/etc/profile

這種方式修改的是全局環境變量配置文件,針對所有的用戶都有效。

#執行如下命令,編輯/etc/profile文件
sudo vi /etc/profile

#在文件最后添加一行
export PATH=$PATH:/要添加的路徑

#保存之后soure命令使修改立即生效
source /etc/profile

注意:修改環境變量配置文件之后,必須執行soure,使修改生效,否則不會立即生效。

6.2 iMX287A交叉編譯工具鏈添加到環境變量

  • 臨時設置

export PATH=$PATH:/opt/gcc-4.4.4-glibc-2.11.1-multilib-1.0/arm-fsl-linux-gnueabi/bin/

  • 對當前用戶永久有效
#執行如下命令,編輯bashrc文件
sudo vi ~/.bashrc

#在文件最后添加一行
export PATH=$PATH:/opt/gcc-4.4.4-glibc-2.11.1-multilib-1.0/arm-fsl-linux-gnueabi/bin/

#保存之后soure命令使修改立即生效
source ~/.bashrc
  • 對所有用戶永久有效
#執行如下命令,編輯/etc/profile文件
sudo vi /etc/profile

#在文件最后添加一行
export PATH=$PATH:/opt/gcc-4.4.4-glibc-2.11.1-multilib-1.0/arm-fsl-linux-gnueabi/bin/

#保存之后soure命令使修改立即生效
source /etc/profile

6.3 查看當前環境變量

修改完成之后,可以通過echo $PATH命令查看當前的環境變量路徑,以確認是否添加成功。
在這里插入圖片描述可以簡單理解為$PATH=這些字符串。

當輸入arm-fsl時,按下TAB鍵,如果能自動補全,說明環境變量配置成功,否則需要檢查是否設置正確。
在這里插入圖片描述

7.scp傳輸文件到開發板

在使用交叉編譯工具鏈,編譯出arm.o文件時,我們是通過拷貝到U盤,然后把U盤插到開發板上來運行程序的,但是這樣未免太麻煩了。
那么有沒有一種簡單的方式,可以在PC Ubuntu主機和開發板快速方便的進行文件傳輸呢?其實有很多種,nfs,ftp,tftp等等,這里我們使用一種最簡單的方式:scp命令。

7.1 從本地復制到遠程

基本的命令格式主要有以下幾種:

#復制本地文件到遠程文件夾,指定了用戶名,需要輸入密碼
scp local_file [email protected]_ip:remote_folder 

#復制本地文件到遠程文件,指定了用戶名,需要輸入密碼
scp local_file [email protected]_ip:remote_file 

#復制本地文件到遠程文件夾,未指定用戶名,需要輸入用戶名和密碼
scp local_file remote_ip:remote_folder 

#復制本地文件到遠程文件,未指定用戶名,需要輸入用戶名和密碼
scp local_file remote_ip:remote_file 

應用示例:

scp /home/space/music/1.mp3 [email protected]:/home/root/others/music 
scp /home/space/music/1.mp3 [email protected]:/home/root/others/music/001.mp3 
scp /home/space/music/1.mp3 192.168.1.136:/home/root/others/music 
scp /home/space/music/1.mp3 192.168.1.136:/home/root/others/music/001.mp3 

復制整個目錄及其子文件

#指定了用戶名,需要輸入密碼
scp -r local_folder [email protected]_ip:remote_folder 

#未指定用戶名,需要輸入用戶名和密碼
scp -r local_folder remote_ip:remote_folder 

應用示例:

#復制當前music目錄下所有文件到遠程others目錄,指定了用戶名,需要輸入密碼
scp -r /home/space/music/ [email protected]:/home/root/others/ 

#未指定用戶名,需要輸入用戶名和密碼
scp -r /home/space/music/ 192.168.1.136:/home/root/others/ 

7.2 從遠程復制到本地

從遠程復制到本地,只要將從本地復制到遠程的命令的后2個參數調換順序即可,如下實例

應用實例:

#復制文件
scp [email protected]:/home/root/others/music /home/space/music/1.mp3 

#復制目錄
scp -r 192.168.1.136:/home/root/others/ /home/space/music/

說明

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

7.3 PC傳輸文件到ARM開發板

scp命令是基于物理網口的,在進行傳輸之前,需要確定開發板和PC主機是可以正常通信的。

  • 開發板配置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,然后輸入開發板的登錄密碼,下面會顯示傳輸的進度。

到開發板上看一下:

在這里插入圖片描述

8.SSH登錄開發板

如果能傳輸成功,說明網絡是通暢的。那么還可以使用SSH方式登錄開發板,和使用串口終端的效果是完全一樣的。

ssh [email protected]_ip

如:ssh [email protected]

在這里插入圖片描述這樣,使用一根網線就完成了終端和文件傳輸的功能,就不用USB-TTL??榱?。

9. NFS傳輸文件

還有一種比較常用的傳輸方式,那就是在主機搭建啟動NFS服務器,把文件夾設置共享目錄,然后開發板把服務器(PC)上的這個文件夾掛載到本地,那PC和開發板都可以直接訪問這個文件夾。

9.1 Ubuntu主機安裝NFS服務器

#安裝NFS服務器 
sudo apt-get install nfs-kernel-server

#安裝NFS客戶端
sudo apt-get install nfs-common

9.2 Ubuntu主機設置共享目錄

創建或設置要共享的目錄

我的共享目錄:/home/whik/imx287/share

并設置最寬松的權限:

#加上所有的權限
sudo chmod -R 777 /home/whik/imx287/share

#任何用戶
sudo chown –R nobody /home/whik/imx287/share

指定NFS共享目錄:

#打開exports文件
sudo vi /etc/exports

#在文件最后添加一行
/home/whik/imx287/share *(rw,sync,no_root_squash)
#表示任意IP網段都可以訪問,權限最寬松

主機啟動NFS服務器:

#啟動
sudo /etc/init.d/nfs-kernel-server start

#重啟
sudo /etc/init.d/nfs-kernel-server restart

#停止
sudo /etc/init.d/nfs-kernel-server stop

在 NFS 服務已經啟動的情況下,如果修改了“/etc/exports”文件,需要重啟 NFS 服務,以刷新 NFS 的共享目錄。當然在下一次啟動系統時,NFS 服務是自動啟動的。

查看當前所有的共享目錄:showmount -e
在這里插入圖片描述

9.3 測試NFS服務器啟動成功

測試是否啟動成功,就是先把PC主機共享目錄掛載到PC本地,PC主機地址:192.168.1.111

#把共享目錄掛載到/mnt目錄
sudo mount -t nfs 192.168.1.111:/home/whik/imx287/share /mnt -o nolock

如果/mnt目錄和共享目錄下的內容完全一致,說明掛載成功。
在這里插入圖片描述這樣,就說明PC主機上的NFS服務器成功啟動,并且共享目錄是可以正常訪問的。

那么,ARM開發板上,如何掛載呢?在進行掛載之前,先確認主機和開發板網絡是通暢的,即互相能ping通。

串口或ssh登錄開發板之后,執行以下命令:

#開發板掛載主機共享目錄到mnt
mount -t nfs 192.168.1.111:/home/whik/imx287/share /mnt -o nolock
#或者
mount -t nfs -o nolock,vers=2 192.168.1.111:/home/whik/imx287/share /mnt

在這里插入圖片描述掛載成功之后,在開發套件的/mnt 目錄下也可以看見主機共享的目錄。然后開發套件就可以像操作本地目錄一樣去操作主機的共享目錄了。

如果不想掛載了,可以使用umount /mnt來取消掛載。有一點要特別注意,無論是執行mount還是umount,執行命令的當前路徑都不能是操作的目標路徑。即不能在/mnt目錄去執行mount和umount命令。

主機和開發板傳輸文件的方式還有很多種,我個人經常用scp命令,不需要設置那么多。其他的方式如ftp/tftp/sftp等都是一樣的原理,這里不再介紹。

10.開機啟動腳本配置

開發板ip配置,在開發板掉電重啟,不會默認配置,所以每次啟動之后,都需要重新ifconfig eth0 192.168.1.136來配置一下IP地址。這樣還是太麻煩了,那么能不能開機自動執行這些配置呢?這就涉及到開發板初始化腳本文件了。

#重新掛載所有文件為可讀寫權限
mount -o remount rw /

#編輯啟動腳本文件
vi /etc/init.d/rcS 

#文件末尾添加以下內容
#啟動界面
/usr/share/zhiyuan/zylauncher/start_zylauncher &

#配置eth0的IP地址
ifconfig eth0 192.168.1.136 &

#自動獲取IP,需要連接路由器聯網時使用
#udhcpc &

#掛載linux主機共享目錄到mnt
mount -t nfs -o nolock,vers=2 192.168.1.111:/home/whik/imx287/share /mnt &

#重新掛載文件為可讀寫權限
mount -o remount rw / &

以上命令,可以根據需要來配置。

注意,如果程序是一個阻塞程序(運行后不會退出或返回的程序),則可能會導致位于其后的指令或程序無法執行。再者,若該程序始終占用串口終端,將會造成其他程序,無法通過串口終端與用戶交互。對于此類應用程序,可以在其后面添加 &

幾個文件的位置:

  • 開發板字庫文件路徑:/usr/lib/fonts
  • 桌面系統啟動界面:/usr/share/zhiyuan/zylauncher
  • Qt 4庫文件路徑:/usr/lib
  • 查找字庫文件:find / -name "*.ttf"

我的公眾號:mcu149

posted @ 2020-03-03 11:02  whik  閱讀(...)  評論(...編輯  收藏