iMX287A開發環境搭建
- 2020 年 3 月 3 日
- 筆記
目錄
@
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
目錄下
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 remote_username@remote_ip:remote_folder #複製本地文件到遠程文件,指定了用戶名,需要輸入密碼 scp local_file remote_username@remote_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 remote_username@remote_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 user_name@remot_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