在學習嵌入式Linux開發之前,我們首先需要做一些准備工作,搭建硬件、軟件開發環境。
一、硬件環境搭建
1.1 交叉開發模式
在開發PC機程序時,可以直接在PC機上編輯、編譯、調試軟件,最終發布的軟件也可以在PC機運行。而對於嵌入式開發,最初的嵌入式設備是一個空白的系統,需要通過主機為它構建基本的軟件系統,並燒寫到設備中。另外,嵌入式設備的資源並不足以用來開發軟件。所以需要用到交叉開發模式:在主機上編輯、編譯軟件,然后在目標機上運行、驗證程序。
1.2 硬件要求
首先我們需要有一個PC主機、目前的PC機基本都可以滿足我們的開發要求,就不做過多的介紹。
其次我們需要有一塊開發板。目前市面上的開發板有很多,這里我們就以友善之臂Mini2440開發板為例,主要是因為我們還處於學習階段,而這款芯片畢竟經典,網上資料也很多,方便我們學習。
二、軟件環境搭建
2.1 VMware安裝
VMware Workstation Pro 15中文破解版下載地址:http://www.zdfans.com/html/16025.html。
下載並解壓,得到安裝程序和注冊文件:
雙擊VMware-workstation-full-15.0.0-10134415.exe運行安裝,點擊下一步:
勾選我接受許可協議中的條款,點擊下一步:
點擊更改選擇軟件安裝路徑,點擊下一步:
選擇需要安裝的快捷方式,點擊下一步:
點擊安裝按鈕開始安裝:
完成中,安裝完成后點擊許可證按鈕:
運行keygen.exe注冊機,將生成的許可證密鑰復制到軟件中,點擊輸入按鈕
破解完成,運行軟件就可以免費使用了。
2.2 ubuntu安裝
嵌入式linux開發以及深度學習開發一般使用ubuntu居多,而centos一般作為web服務器使用。本節以ubuntu20.04.2.0安裝為例,下載地址http://mirrors.163.com/ubuntu-releases/。
(1) 打開WMware,在vmware主界面的“主頁”標簽點擊創建虛擬機向導。如下圖所示。
(2) 向導界面選擇“自定義高級”,如下圖所示:
(3) 然后下一步,兼容性選擇當前vmware版本,比如本人是15版就選擇15版。如果要分發虛擬機給別人使用,就選擇別人的版本。如下所示。
(4) 下一步,選擇稍后安裝操作系統,如下所示
(5) 選擇客戶機操作系統:
(6) 下一步,虛擬機名稱可以隨便取。“位置”就是將來虛擬機文件所在的目錄,因為虛擬機文件比較大,要選擇一個磁盤空間比較大的目錄
(7) 下一步,設置要分配給虛擬機的CPU,電腦配置高的可以往上調,如果要同時運行兩個以上虛擬機就少分配一點,一般采用默認值就可以:
(8) 下一步,Ubuntu內存配置:
(9)、網絡配置,采用橋接網絡:
(10) 硬盤控制器,沒有特殊情況就選默認值:
(11) 硬盤類型,沒有特殊情況就選默認值:
(12) 創一個新的磁盤,如果使用單獨物理磁盤的選第三項:
(13) 磁盤空間,一般默認20G就夠了,如果要裝的軟件特別多就多分配一點,一般空的Ubuntu16裝完占用10G左右,剩10G軟件空間:
(14)、磁盤文件名,沒有什么影響隨便去一個就好了
(15) 到這一步就創建完一個虛擬機了,如下。如果對剛才的配置不滿意可以點“自定義”進一步修改:
(16) 在啟動虛擬機前進行虛擬機設置:
要在這里選擇你的iso文件。然后啟動操作系統,開始真正的系統安裝。
(16) 語言選擇簡體中文,點擊安裝ubuntu:
(17) 點擊繼續:
(18) 然后選擇清除整個磁盤並安裝ubuntu:
(19) 點擊繼續:
(19) 設置登錄密碼為123456:
等待完成之后重啟就行了!!!
三、ubuntu配置
3.1 修改root密碼
修改root密碼(123456aa):
sudo passwd root
sudo 它允許系統管理員分配給普通用戶一些合理的權力,讓他們執行一些只有超級用戶或者其他特權用戶才能完成的任務。比如 mount、halt、su,useradd等命令,sudo權限分配是通過文件/etc/sudoers配置的。
我們每次重啟系統只能通過zhengyang賬號登錄,如果想使用root用戶登錄系統,參考Ubuntu18.04中設置使用root用戶登錄圖形界面。
3.2 網絡設置
WMware網絡設置支持三種模式:
- bridged(橋接模式):虛擬機能得到一個獨立IP地址,網絡能提供多個IP地址;虛擬機可以訪問外部網絡,外部網絡也可以訪問虛擬機
- NAT(網絡地址轉換模式) : 如果網絡中只提供一個IP地址,虛擬機和主機使用一個IP地址;虛擬機可以外部網絡,但是外部網絡訪問不了虛擬機
- 主機模式 (主機沒有聯網):相當於把主機和虛擬機通過一根網線連接在一起;
之前我們在安裝ubuntu的時候選擇了橋接模式。我們需要設置ubuntu和主機在同一網段內。由於我的windows操作系統的IP為192.168.0.101:
查看ubuntu的網絡配置:
可以看到,本例中的網卡為“ens33”,同時可以看到相應的IP信息等。
不同的linux系統,網卡配置文件是不同的,這里ubuntu的網卡配置文件是/etc/network/interfaces:
我們首先安裝vim:
sudo apt install vim
輸入下面命令進行編輯網卡文件:
sudo vim /etc/network/interfaces
默認的文件內容如下:
auto lo
iface lo inet loopback
修改內容如下:下面的ens33需要改成自己的網卡名稱。ip地址,掩碼網關自己合理配置就行了。記得wq!保存退出:
auto ens33 iface ens33 inet static address 192.168.0.200 netmask 255.255.255.0 gateway 192.168.0.1
配置DNS,在終端輸入命令:
sudo vim /etc/resolv.conf
在其中添加192.168.1.1這個和物理機要保持一致:
nameserver 192.168.1.1
然后重啟ubuntu服務器,運行ifconfig可以看到ip地址已經改為192.168.0.200:
3.3 SSH服務搭建
安裝ssh-server服務,用於ssh工具遠程連接:
sudo apt-get install openssh-server
查看ssh是否已經啟動:
ps -ef | grep ssh
我們通過ssh工具連接ubuntu服務器,如果發現連接不上的話。在ubuntu終端下,切換到root用戶:
su root vim /etc/ssh/sshd_config
PermitRootLogin yes

保存后,重啟ssh服務:
service ssh restart
再次通過ssh工具連接,我們就可以連接成功了:
3.4 FTP服務搭建
FTP是用來下載遠程文件的最簡單網絡協議,在嵌入式開發中,由於嵌入式開發板資源有限,不能進行文件編譯,因此我們都是將寫好都代碼在宿主機(Linux虛擬機)上進行調試編譯好后生成二進制文件,然后通過ftp或NFS來進行傳輸到開發板上運行。也就是ARM開發板當做客戶端, 使用虛擬機 Ubuntu來當做服務器。
sudo apt-get install vsftpd
修改vsftpd的配置文件/etc/vsftpd.conf:
sudo vim /etc/vsftpd.conf
將下面幾行前面的#去掉:
修改完成后,執行重啟命令:
sudo /etc/init.d/vsftpd restart
3.5 安裝TFTP
u-boot支持通過TFTP的方式加載內核,ubuntu上運行TFTP服務器,u-boot向服務器請求其參數指定的文件,主機收到請求后將TFTP傳輸目錄下的相應文件通過網絡傳輸給u-boot。這需要主機具有TFTP環境。搭建過程分一下幾個步驟:
安裝TFTP:
sudo apt install tftp-hpa tftpd-hpa
建立TFTP傳輸目錄
cd /work/ mkdir tftpboot chmod 0777 tftpboot
修改TFTP配置文件/etc/default/tftpd-hpa:
TFTP_USERNAME="tftp" # TFTP傳輸目錄 TFTP_DIRECTORY="/work/tftpboot" TFTP_ADDRESS="0.0.0.0:69" # -c表示可以上傳文件,-s表示指定TFTP傳輸目錄,上面已經指定 TFTP_OPTIONS="-l -c -s"
重啟TFTP服務:
service tftpd-hpa restart
為了確保環境搭建成功,可以做一些測試。在上文設置的tftp傳輸目錄下創建文件test。然后進入某個目錄,假設是/work目錄,運行如下命令:
#localhost 表示本機
tftp localhost
此時進入TFTP的命令行,輸入如下命令:
tftp> get test
tftp> put test Error code 0: Permission denied tftp> q
/work目錄下出現文件test,表示TFTP服務器安裝成功。
3.6 NFS服務搭建
NFS 就是 Network FileSystem 的縮寫,最早之前是由sun 這家公司所發展出來的。它最大的功能就是可以透過網絡,讓不同的機器、不同的操作系統、可以彼此分享文件。NFS可以讓你的PC通過網絡將遠端的NFS 服務器共享出來的文件mount到自己的系統中,在客戶端看來使用NFS的遠端文件就象是在使用本地文件一樣。 使用NFS可以使應用程序的開發變得十分方便, 客戶端不需要大容量的存儲器,更不需要進行映像文件的燒錄和下載,只要mount到服務器端的特定目錄下,然后運行該目錄下的程序即可觀察到結果。嵌入式項目中常用nfs來掛載文件系統。
sudo apt-get install nfs-kernel-server portmap
它的配置文件為/etc/exports,添加共享目錄:
格式 : /tmp *(rw, sync, no_root_squash)
共享文件 可訪問用戶 權限 寫回源文件? 客戶端使用root,則想要root權限
我們創建一個目錄/work/nfs_root,配置/etc/exports:
/work/nfs_root *(rw,sync,no_root_squash)
修改完畢之后,啟動NFS服務器
sudo /etc/init.d/nfs-kernel-server restart/start/stop
查看是否啟動:
netstat -a | grep nfs
為了確保nfs環境搭建成功,不妨做一下測試。掛接nfs共享目錄到/mnt/rootfs路徑下,即執行如下命令,其中,-t選項用於指定文件系統的類型為nfs。
mkdir -p /mnt/rootfs mount -t nfs localhost:/work/nfs_root /mnt/rootfs
然后訪問/mnt/rootfs,可見/work/nfs_root目錄下的內容出現在/mnt/rootfs目錄下,說明環境搭建成功。
root@zhengyang:~# ls /mnt/rootfs test
我這里在/work/nfs_root路徑下創建了一個test文件。
共享目錄使用結束之后,卸載共享目錄,運行以下命令:
umount /mnt/rootfs
3.7 搭建samba服務器
因為我是在windows上開發,Ubuntu編譯。因此windwows之間的文件共享是非常重要的。通常有兩種方式:samba服務器或者共享文件夾。
Samba是在Linux和UNIX系統上實現SMB協議的一個免費軟件,由服務器及客戶端程序構成。它可以實現windows和Unix-Like兩個平台之間互相分享文檔和數據。 Samba服務器的工作原理是:客戶端向Samba服務器發起請求,請求訪問共享目錄,Samba服務器接收請求,查詢smb.conf文件,查看共享目錄是否存在,以及來訪者的訪問權限,如果來訪者具有相應的權限,則允許客戶端訪問,最后將訪問過程中系統的信息以及采集的用戶訪問行為信息存放在日志文件中。
安裝samba:
sudo apt-get install samba
測試是否安裝成功:
smb[按TAB TAB補全]
配置samba:
cd /work mkdir sambashare cd /etc/samba/
sudo cp smb.conf smb.cong.bkp //備份samba配置文件
sudo vi smb.conf
輸入如下內容:
[share] comment=samba path=/work/sambashare public=yes create mask=0777 directory mask=0777 writable=yes available=yes forceuser=root forcegroup=root
重啟samba:
sudo /etc/init.d/smbd restart
windows下訪問samba服務器:
步驟:網絡--->\\192.168.0.200--->Enter回車鍵:發現出現了一個share文件夾
測試:
- 步驟1:在share文件夾下創建一個test.txt。
- 步驟2:ubuntu中 cd /worksambashare/,ls發現出現了一個test.txt
3.8 安裝基本開發環境
安裝build-essential軟件包,build-essential作用是提供編譯程序必須軟件包的列表信息:
sudo apt-get install build-essential
安裝bison、flex,它們分別是語法、詞法分析器:
sudo apt-get install bison flex
安裝C函數庫的man手冊,這樣就可以通過類似"man read"命令查看函數的作用:
sudo apt-get install manpages-dev
3.9 安裝交叉編譯環境arm-linux-gcc
交叉編譯環境可以在ARM官網下載:https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads ,或者到http://releases.linaro.org/components/toolchain/binaries/下載。
選擇交叉編譯環境這一步需要慎重,我們首先要知道我們自己使用的開發板采用的ARM架構是哪一個?ARM目前總共發布了8種架構:ARMv1、ARMv2、ARMv3、ARMv4、ARMv5、ARMv6、ARMv7、ARMv8。
確認了ARM架構之后,選擇支持該架構的交叉編譯環境。可以參考GNU Arm Embedded Toolchain官網中的文檔和說明來確定march支持的版本。在ARM官方提供的文檔中,可以查看到march選項支持的處理器架構和對應的版本。例如,使用arm-linux-gcc --march=armv8-a命令編譯代碼時,表示編譯針對於Cortex-A53處理器。
由於我后面學習使用的是Mini2440開發板,其采用的samsung SoC型號為s3c2440基於ARM9,采用的ARMv4架構,因此這里我選擇了arm-linux-gcc-4.3.2,當然也可以選擇高版本的,只要其支持ARMv4即可。
下載安裝包並把文件放在linux系統的路徑/work/sambashare路徑下:
注:
- 如果想安裝高版本交叉編譯工具比如arm-linux-gcc 4.8.3,可以參考博客Mini2440之linux內核移植第2.10小節內容。
然后將arm-linux-gcc-4.3.2移動到/opt/tools目錄下,使用一下命令進行解壓:
mkdir /opt/tools mv /work/sambashare/arm-linux-gcc-4.3.2.tgz /opt/tools/ cd /opt/tools/
tar -xzvf arm-linux-gcc-4.3.2.tgz -C /
執行該命令,將把arm-linux-gcc 自動安裝到/usr/loca/arm/4.3.2 目錄:
接下來配置系統環境變量,把交叉編譯工具鏈的路徑添加到環境變量PATH中去,這樣就可以在任何目錄下使用這些工具:
編輯profile文件,添加環境變量。
vim /etc/profile
添加如下代碼:
export PATH=$PATH:/usr/local/arm/4.3.2/bin
接下來使用命令:source /etc/profile,使修改后的profile文件生效。
然后,使用命令:arm-none-linux-gnueabi-gcc -v查看當前交叉編譯鏈工具的版本信息,arm-none-linux-gnueabi-gcc和arm-linux-gcc命令意義一樣:
如果出現錯誤:arm-none-linux-gnueabi-gcc: No such file or directory。
是因為ubuntu是64位的,但arm-linux-gcc是32位的,需要安裝如下包:
sudo apt-get install lib32ncurses5
需要觀察:arm-none-linux-gnueabi-gcc -v輸出時是否默認配置了-march=armv4t,如果有這個,那說明這個編譯器只能用來編譯armv4t指令集的處理器。
然后驗證交叉編譯工具鏈是否安裝成功並且可以使用,隨便找一個目錄編輯一個hello源代碼,vim hello.c:
編輯好hello.c文件后,保存退出。然后使用交叉編譯器對hello.c進行編譯,並生成可執行文件hello:
這里生成的hello文件並不能像gcc編譯出來的文件那樣直接使用“./hello”命令執行並顯示內容,因為它是一個二進制文件,只能下載到開發板上執行!
如何知道我們編譯器默認指定的-march是什么呢?可以通過如下命令查看可執行文件的平台屬性信息:
root@zhengyang:/work/tool# arm-linux-readelf -A hello Attribute Section: aeabi File Attributes Tag_CPU_name: "5TE" Tag_CPU_arch: v5TE // 架構armv5t Tag_ARM_ISA_use: Yes Tag_THUMB_ISA_use: Thumb-1 Tag_ABI_PCS_wchar_t: 4 Tag_ABI_FP_rounding: Needed Tag_ABI_FP_denormal: Needed Tag_ABI_FP_exceptions: Needed Tag_ABI_FP_number_model: IEEE 754 Tag_ABI_align_needed: 8-byte Tag_ABI_align_preserved: 8-byte, except leaf SP Tag_ABI_enum_size: int
3.10 安裝調試工具arm-linux-gdb
下載arm-linux-gdb-7.5.tar.gz,,使用一下命令進行解壓:
mv /work/sambashare/arm-linux-gdb-7.5.tar.gz /opt/tools/ cd /opt/tools/
tar xzvf arm-linux-gdb-7.5.tar.gz -C /usr/local
進入arm-linux-gdb-7.5,解壓並配置:
cd arm-linux-gdb-7.5
tar -ivzxf gdb-7.5.tar.gz cd gdb-7.5 ./configure --target=arm-linux --disable-werror --prefix=/usr/local/gdb -v
注:--target=arm-linux意思是說目標平台是運行於ARM體系結構的linux內核;--prefix是指生成的可執行文件安裝在哪個目錄,這個目錄需要根據實際情況作選擇。如果該目錄不存在,會自動創建,當然,權限足夠的話。
然后編譯安裝:
make
make install
編譯會出現如下錯誤:
上述錯誤的原因是:缺少前置文件,執行安裝:
sudo apt-get install libncurses5-dev
安裝過程如果出現texinfo相關的錯誤,則請執行:
sudo apt-get install texinfo
再次編譯安裝,正確安裝后,會在指定安裝路徑下生成:bin、include、lib、share文件夾。
配置/etc/profile,最后加上:
vim /etc/profile
export PATH=$PATH:/user/local/gdb/bin
使剛配置的環境變量生效:
source /etc/profile
注意如果之前安裝的arm-linux-gcc里面也存在gdb的話,為了使用剛剛安裝的7.5版本gdb,應將gdb7.5添加在gcc的環境變量前面。保證優先使用gdb7.5而不是gcc套件里的gdb。
四、安裝Jlink
4.1 下載jlink
在JLink官網下載deb后綴,https://www.segger.com/downloads/jlink/#J-LinkSoftwareAndDocumentationPack:
需要注意的這里我沒有下載最新的,我下載的版本是JLink_Linux_V434a.tgz。如果官網不找不到,請到其他資源查找。
4.2、上傳到linux服務器
下載完成之后,利用samba服務器上傳至linux服務器。
4.3、安裝程序
在ubuntu可視化界面上,利用命令安裝:
mv /work/sambashare/JLink_Linux_V434a.tgz /opt/tools cd /opt/tools tar -zvxf JLink_Linux_V434a.tgz -C /usr/local
進入/usr/local/JLink_Linux_V434a路徑,然后執行命令 cp -d libjlinkarm.so.4* /usr/lib -f 將庫復制到lib里面
cd /usr/local/JLink_Linux_V434a cp -d libjlinkarm.so.4 /usr/lib -f
最后執行 ./JLinkGDBServer:
./JLinkGDBServer
如果出現如下錯誤:
動態鏈接庫缺失,安裝libusb-dev:i386
sudo apt install libusb-dev:i386
Ubuntu機連接好Jlink后,再次運行./JLinkGDBServer,此時會出現正常連接上jlink的提示,並且會顯示ID和ARM9的字樣,說明安裝驅動成功:
參考文章
[1] 嵌入式Linux開發環境搭建