在qemu上搭建開(kāi)發(fā)aarch64 rtos環(huán)境
掃描二維碼
隨時(shí)隨地手機(jī)看文章
前言
隨著芯片技術(shù)的發(fā)展,嵌入式已經(jīng)不再是傳統(tǒng)的單片機(jī)開(kāi)發(fā)模式,需要一些硬件操作的板子,現(xiàn)在qemu這種模擬硬件的手段非常好,通過(guò)直接在電腦上仿真后,然后再移植到真實(shí)的設(shè)備上,這樣大大減少了下載程序的時(shí)間,同時(shí)也方便問(wèn)題的定位和分析,通過(guò)這種方式,進(jìn)行業(yè)務(wù)邏輯層的開(kāi)發(fā)更加的高效合理。本文主要介紹在qemu上搭建樹(shù)莓派3b的開(kāi)發(fā)環(huán)境。
準(zhǔn)備條件:
Ubuntu16.04
下面的實(shí)驗(yàn)步驟在Ubuntu16.04上進(jìn)行,盡量保證環(huán)境的一致性。
01
代碼編譯
對(duì)于一個(gè)環(huán)境,我們往往需要進(jìn)行源代碼工程的構(gòu)建,所以現(xiàn)在我們選擇的是rt-thread操作系統(tǒng)進(jìn)行相關(guān)的開(kāi)發(fā)工作。
1.1 工具鏈的準(zhǔn)備
推薦采用gcc-arm-8.3-2019.03-x86_64-aarch64-elf進(jìn)行源代碼的編譯,由于官方下載速度非常慢,所以我放到網(wǎng)盤(pán)上提供下載。
鏈接: https://pan.baidu.com/s/1ZAba3xbhad-BnimCo5VDGA
提取碼: a6t5
解壓到opt目錄下。
1.2 編譯rtt工程
在github上的rt-thread上進(jìn)行下載
git clone git@github.com:RT-Thread/rt-thread.git
切換到rt-thread/bsp/raspberry-pi/raspi3-64目錄,輸入scons開(kāi)始編譯
最后生成kernel8.img文件就是可執(zhí)行文件。
02
qemu的安裝
直接通過(guò)Ubuntu進(jìn)行sudo apt-get install qemu安裝的qemu版本較低,不支持arrch64體系架構(gòu),所以我們需要去下載安裝最新版本的qemu,到官網(wǎng)上下載即可。

下載完成后解壓文件。
或者從github中clone代碼
git clone git@github.com:qemu/qemu.git
git submodule update --init --recursive
2.1 編譯qemu
由于最新版本的qemu只是源代碼,所以還需要進(jìn)行qemu的編譯。
查看當(dāng)前所有支持命令
./configure --help|less
可以看到如下信息

其中我們可以看到aarch64-softmmu,aarch64-linux-user,aarch64_be-linux-user。對(duì)于這三個(gè)編譯選項(xiàng):
aarch64-softmmu:
一般選擇,用來(lái)跑os的,已經(jīng)開(kāi)了軟件mmu。
aarch64-linux-user:
用于跑app
aarch64_be-linux-user :
與上面不同的是,用來(lái)跑big-endian的app程序。
編譯
./configure --target-list=arm-softmmu,aarch64-softmmu --enable-debug --enable-sdl
make
make install
03
運(yùn)行raspi鏡像
正常情況下,當(dāng)安裝完成后,在控制臺(tái)輸入qemu-system-aarch64 -M raspi3 -kernel kernel8.img -serial null -serial stdio就可以看到程序正常的運(yùn)行起來(lái)了。

3.1 啟動(dòng)調(diào)試
如果要啟動(dòng)調(diào)試,可以輸入以下的命令
qemu-system-aarch64 -M raspi3 -kernel rtthread.elf -serial null -serial stdio -s -S
-S 表示guest虛擬機(jī)一啟動(dòng)就會(huì)暫停
-s 表示監(jiān)聽(tīng)tcp:1234端口等待GDB的連接
第一步:
開(kāi)一個(gè)窗口,輸入aarch64-elf-gdb.

第二步:
等待連接操作,然后輸入target remote localhost:1234連接

第三步:
打開(kāi)需要調(diào)試的文件,輸入路徑file /home/bigmagic/work/raspberry-pi/src/rt-thread/bsp/raspi3-64/rtthread.elf這個(gè)路徑是需要調(diào)試的文件。

到這里就配置完成了。
3.2 調(diào)試技巧
首先可以輸入layout src打開(kāi)源代碼顯示窗口。

斷點(diǎn)
輸入斷點(diǎn)可以是函數(shù)名稱,可以是行號(hào),可以是某個(gè)文件的具體函數(shù)。
break main //也可以寫(xiě) b main
或者文件的第20行。
break 20
演示效果如下:

其中c是continue的簡(jiǎn)寫(xiě)。會(huì)向下執(zhí)行,執(zhí)行到斷點(diǎn)處。
如果我們想刪除某個(gè)斷點(diǎn),有兩種方法:
1 delete 命令 簡(jiǎn)寫(xiě)d
delete break 刪除所有的斷點(diǎn)
delete break n 刪除某個(gè)斷點(diǎn) n為斷點(diǎn)號(hào)
2 clear 命令
clear 行號(hào) 刪除設(shè)在某一行的斷點(diǎn)
查看斷點(diǎn)信息:info b 查看所有斷點(diǎn)信息。
單步調(diào)試
進(jìn)入函數(shù)內(nèi)部單步調(diào)試step,簡(jiǎn)寫(xiě)s。
安裝函數(shù)一行一行執(zhí)行next,簡(jiǎn)寫(xiě)n。
04
總結(jié)
嵌入式開(kāi)發(fā)過(guò)程中,往往避免不了與硬件打交道,但是通過(guò)qemu這種模擬硬件的方式,往往能夠很好的加快調(diào)試的手段,在出現(xiàn)問(wèn)題的時(shí)候,可以借助gdb等調(diào)試工具進(jìn)行分析,也加快了開(kāi)發(fā)的速度,是一種比較好的手段。