文章目錄
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 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