本系列前3篇文章介紹硬件設(shè)計(jì)與實(shí)現(xiàn),但光有硬件,再好的東西也跑不起來。因此,本篇將介紹如何搭建軟件開發(fā)環(huán)境。本文所使用的軟件均為開源軟件。
軟件開發(fā)環(huán)境的搭建分為2個(gè)部分:
(1)Arduino 端軟件開發(fā)環(huán)境;
(2)NDS端軟件開發(fā)環(huán)境。
一、搭建Arduino軟件開發(fā)環(huán)境
可以說搭建Arduino端開發(fā)環(huán)境幾乎沒有一點(diǎn)技術(shù)含量。只需要從Arduino官網(wǎng)站下載最新版(盡量不要使用beta版)軟件,然后在Windows或Mac OS的電腦上安裝即可使用,自帶IDE。而Linux版相對復(fù)雜一些,可以參考官方的Linux安裝文檔:Installing Arduino on Linux,這里不再詳述。
另外一點(diǎn),由于設(shè)計(jì)方案中使用最小Arduino系統(tǒng),上傳程序有兩種方案:
(1)使用另一塊無CPU的Arduino主板提供串口實(shí)現(xiàn)程序燒寫;
(2)使用一個(gè)USB轉(zhuǎn)串口的線(帶FDTI芯片)實(shí)現(xiàn)程序燒寫,如圖1。
以上兩種方案任選其一即可。使用Arduino主板燒寫程序可以參考擴(kuò)展NDS掌機(jī)連接Arduino (1)--Arduino端最小系統(tǒng)實(shí)現(xiàn) 中的第三步。
二、搭建NDS軟件開發(fā)環(huán)境
NDS開發(fā)環(huán)境分為兩部分:(1)編譯環(huán)境;(2)調(diào)試環(huán)境。下面先講編譯環(huán)境的建立。
NDS開發(fā)使用開源開發(fā)套件:devkitPro。devkitPro分為好幾個(gè)部分,其中GBA,NDS,GP32都是基于ARM的CPU,因此都使用devkitARM子套件。然后再配套使用一些庫。
2.1,需要安裝的內(nèi)容
對于NDS開發(fā)必要安裝的如下:
(1)devkitARM:含gcc, g++, objcopy, as, ld, gdb等必要工具。
(2)ndstool:用于將NDS的ARM7和ARM9二進(jìn)制代碼進(jìn)行合并成一個(gè)可以運(yùn)行在NDS上的nds文件的工具。
選擇安裝的庫和工具如下:
(3)libnds:定義了各寄存器必要的宏和相關(guān)的常量以及大量實(shí)用的庫函數(shù),一般開發(fā)都需要。
(4)default_arm7:NDS的ARM7端運(yùn)行的代碼。
(5)dswifi:WiFi代碼庫。
(6)libfat:FAT文件系統(tǒng)庫函數(shù),支持各燒錄卡文件讀寫。
(7)libfilesystem:NDS的nitro文件系統(tǒng)的支持庫。
(8)maxmod:音頻支持庫。
(9)dlditool:用于給ndstool產(chǎn)生的nds文件打dldi補(bǔ)丁的工具。如果程序沒用到FAT文件讀寫功能,不需要打dldi補(bǔ)丁,另外一部分燒錄卡有自動(dòng)打dldi補(bǔ)丁的功能,也不需要。
(10)general-tools:提供了幾個(gè)有用的工具:bin2s, bmp2bin, padbin, raw2c。
(11)dstools:提供r4denc這個(gè)工具。
(12)mmutil:提供mmutil這個(gè)工具,用于將 MOD, S3M, XM, IT, and/or WAV文件轉(zhuǎn)換成可以運(yùn)行用的GBA或NDS ROM。
(13)nds-examples:nds的很多例子程序,非常實(shí)用,可以對照自己寫。
2.2,編譯環(huán)境安裝過程
安裝過程在不同操作系統(tǒng)上有明顯區(qū)別。如果在Windows上安裝,devkitPro提供了自動(dòng)安裝文件可自動(dòng)完成安裝。對于Linux和Mac OS X則需要手動(dòng)安裝,下面重點(diǎn)講解在這兩個(gè)系統(tǒng)上的安裝過程。安裝以上內(nèi)容,可以選擇編譯源碼安裝,也可以下載編譯好的二進(jìn)制文件手動(dòng)復(fù)制到相應(yīng)目錄內(nèi)完成安裝。我這里選擇編譯源碼安裝。
步驟一:首先下載以上11個(gè)內(nèi)容。除了devkitARM下載二進(jìn)制文件外,其余全下載源碼進(jìn)行編譯安裝。
在相應(yīng)目錄下創(chuàng)建devkitPro文件夾,并將解壓后的devkitARM文件夾拷到里面。例如我的Mac OS上創(chuàng)建的路徑如下:/Users/Vincent/Documents/OS_Dev/devkitPro/devkitARM。devkitARM文件夾內(nèi)的內(nèi)容如下圖:
步驟二:設(shè)置環(huán)境變量。根據(jù)自己使用的操作系統(tǒng)編輯不同的文件:Linux在~/.bashrc文件,Mac OS X在~/.bash_profile文件(“.“開頭的是默認(rèn)隱藏文件,所以手工用命令行創(chuàng)建)中最后加入以下代碼(實(shí)際路徑按你自己來寫):
#Set Variables for DEVKIT_PRO
export DEVKITPRO=/Users/Vincent/Documents/OS_Dev/devkitPro
export DEVKITARM=${DEVKITPRO}/devkitARM
保存后,重啟Terminal終端,路徑已經(jīng)完成設(shè)置。
步驟三:安裝libnds。將libnds庫源碼解壓到devkitPro文件夾內(nèi),和devkitARM同級(jí),即devkitPro文件夾內(nèi)有l(wèi)ibnds-src-x.x.x文件夾,其中x.x.x是版本號(hào)。進(jìn)入該文件夾運(yùn)行 make,以上步驟沒出錯(cuò)的話,稍等片刻libnds庫就編譯好了,然后運(yùn)行 make install 進(jìn)行安裝。安裝完成后會(huì)在devkitPro文件夾下創(chuàng)建libnds文件夾,相應(yīng)的.a庫文件被拷到這里。
步驟四:安裝各個(gè)庫。將2.1小節(jié)內(nèi)下載的(4)~(8)源代碼按步驟三的方式解壓,進(jìn)入子目錄,然后make, make install,完成安裝。因?yàn)檫@些庫依賴libnds,所以要確保libnds先安裝好。特別要注意一點(diǎn)是maxmod庫如果用make命令,會(huì)同時(shí)編譯NDS, GBA兩個(gè)板本,而要成功編譯GBA版本需要安裝libgba。如果只需要使用NDS版的maxmod庫,則需要執(zhí)行:make dist-nds, 然后執(zhí)行:make install-nds。細(xì)節(jié)可參考相應(yīng)的Makefile文件。
步驟五:安裝ndstool, dlditool, general-tools, dstools, mmutil,其中ndstool是必須的。按2.1小節(jié)內(nèi)下載的這些源碼按步驟三的方式解壓,進(jìn)入相應(yīng)子目錄,然后先運(yùn)行 .configure, 然后運(yùn)行 make, 最后運(yùn)行sudo make install,完成安裝。最后一步因?yàn)橐惭b到系統(tǒng)文件夾路徑下,需要管理員權(quán)限,所以加sudo運(yùn)行。
步驟六:編譯nds-examples:按2.1小節(jié)內(nèi)下載的這些源碼按步驟三的方式解壓,進(jìn)入相應(yīng)子目錄,然后先運(yùn)行make。不出意外的話,所有例子程序就會(huì)編譯成功,在nds-examples-xxxxxxxx文件夾(xxxxxxxx是日期版本號(hào))內(nèi)會(huì)多出一個(gè)bin子文件夾,里面是編譯出來的nds程序。如果有模擬器就可以運(yùn)行了。
至此,NDS的編譯環(huán)境安裝完成,下面講解相對復(fù)雜的調(diào)試環(huán)境。
2.3,調(diào)試環(huán)境建立過程
可以說不使用價(jià)格昂貴的任天堂官方開發(fā)套件,構(gòu)建NDS的調(diào)試環(huán)境是比較復(fù)雜的,該部分也是本文最復(fù)雜部分。
NDS調(diào)試環(huán)境搭有幾種方案選擇:
(1)選擇任天堂官方開發(fā)套件:價(jià)格昂貴,個(gè)人幾乎不可能購買。
(2)使用no$gba debugger版模擬器:收費(fèi),最便宜的$15的個(gè)人版功能有限,功能強(qiáng)大的企業(yè)版上千美元。而且只支持Windows系統(tǒng)。我用過個(gè)人版,調(diào)試過程是在no$gba軟件內(nèi)部進(jìn)行,非常不方便使用,不符合一般開發(fā)人員的使用習(xí)慣,而且功能實(shí)在有限。
(3)使用DeSmuME模擬器 + Insight。devkitPro提供編譯好的Insight,只支持Windows系統(tǒng)。
(4)使用DeSmuME模擬器 + GDB + DDD。這是我用過最習(xí)慣的最舒服的環(huán)境,而且支持Linux, Mac OS X系統(tǒng)。
主張開源,免費(fèi)的我,方案(1)和(2)直接淘汰。對于方案(3),因?yàn)镮nsight是內(nèi)部集成GDB調(diào)試器的,兩者不能獨(dú)立,而且在Linux和Mac OS X系統(tǒng)下Insight默認(rèn)使用的GDB是i386架構(gòu)的版本,讀者需要自行配置arm版本進(jìn)行重新編譯,這種捆綁形式對我不是很感冒。因此,本文推薦方案(4),一方面由于DDD體積小,和GDB獨(dú)立,另一方面這個(gè)方案擴(kuò)展性好。擴(kuò)展性很重要,以后如果3DS, PSV等掌機(jī)破解后,可開發(fā)自制程序,都可以使用這個(gè)方案進(jìn)行配置。
下面以Mac OS X系統(tǒng)上如何配置調(diào)試方案(4)進(jìn)行詳述。
2.3.1 DeSmuME模擬器及調(diào)試功能的使用
DeSmuME是一款NDS模擬器,從玩游戲角度來說沒no$gba好,但對開發(fā)人員來說支持GDB調(diào)試接口。模擬器的Windows和Linux發(fā)行版直接集成了GDB stub接口,可直接使用。而且Mac OS X發(fā)行版默認(rèn)不支持GDB stub,因此需要自行編譯源碼來支持。這不是本文的目的,因此我這里直接采用國外一高手編譯好的版本來使用。Mac OS X上的具體編譯過程可以參考:Installing DeSmuME from source on OS X 這個(gè)官方教程。
使用DeSmuME調(diào)試功能,需要命令行帶參數(shù)執(zhí)行:
your_path/DeSmuME.app/Contents/MacOS/DeSmuME -arm9gdb 20000
兩點(diǎn)說明:
(1)Mac OS X的軟件實(shí)質(zhì)上都是.app文件夾,真正的可執(zhí)行程序在其Contents/MacOS/路徑下。因此,Windows版本和Linux版本無需前面部分,直接運(yùn)行your_path/DeSmuME -arm9gdb 20000。這里的your_path是你電腦上存放DeSmuME的路徑。
(2)這里的參數(shù)-arm9gdb 20000:前面的 -arm9gdb 是指啟動(dòng)arm9的代碼調(diào)試功能。20000是GDB遠(yuǎn)程調(diào)試的IP端口號(hào),按約常規(guī)的方式不要使用0?1023這1024個(gè)保留端號(hào)口。因?yàn)镹DS有兩個(gè)CPU,如果要調(diào)試arm7部分的代碼,則使用-arm7gdb xxxx,即可。
按上面的命令行執(zhí)行后,模擬器就會(huì)啟動(dòng),見圖3左。然后選擇菜單選擇相應(yīng)的需要調(diào)的.nds自制程序,加載后效果見圖3右。
圖3. 左:帶GDB調(diào)試功能啟動(dòng)模擬器。右:加載NDS可執(zhí)行文件后的模擬器。
圖3右,模擬器顯示白色,下方顯示"Executing",這說明此時(shí)模擬器已準(zhǔn)備就緒,等待GDB調(diào)試器的遠(yuǎn)程連接,并接受GDB發(fā)來的命令進(jìn)行操作。至此,模擬器部分準(zhǔn)備工作就緒。
2.3.2 GDB調(diào)試器功能的使用
一般一個(gè)特定平臺(tái)(如ARM或MIPS)的工具鏈中除了提供gcc, as, ld, objcopy等工具外,也同時(shí)會(huì)提供相應(yīng)的gdb。devkitARM中提供的GDB位于路徑: devkitARM/bin/arm-none-eabi-gdb 。
要使用GDB調(diào)試程序,首先被調(diào)試程序必須含有可調(diào)試信息。這要求在編譯程序源碼時(shí)必須添加 -g 命令行參數(shù),如:
gcc -g hello_world.c
在devkitARM工具鏈中生成的二進(jìn)制文件中含有elf格式文件,后綴名也為.elf。這個(gè)elf文件就可以用來在GDB中進(jìn)行調(diào)試。執(zhí)行如下命令:
your_path/arm-none-eabi-gdb file_path/hello_world.elf
然后會(huì)進(jìn)入GDB命令行。因?yàn)槲覀兊某绦蛐枰虳eSmuME配合調(diào)試,程序本質(zhì)上是在模擬器上運(yùn)行,因此,GDB需要和DeSmuME建立IP連接,所以在GDB命令行中輸入以下命令:
target remote :2000
這條命令的原型為:target remote IP:port 。IP為需要被調(diào)試的目標(biāo)的IP地址,port為端號(hào)口。因?yàn)槲覀兊哪繕?biāo)(模擬器)也在本機(jī)上,因?yàn)镮P可以不寫,端口號(hào)一定要與模擬器運(yùn)行時(shí)的一致。執(zhí)行上述命令后,如果DeSmuME已經(jīng)按上述設(shè)置好,GDB就能成功連接上模擬器,顯示圖4內(nèi)容:
此時(shí),可以輸入GDB命令控制模擬器,比如單步執(zhí)行(Step, Next),執(zhí)行到下一個(gè)斷點(diǎn)(Continue),顯示代碼(List),設(shè)置斷點(diǎn)(Break)等等,具體可以參考GDB使用手冊。圖5為我讓顯示讓程序執(zhí)行到斷點(diǎn)(37行)時(shí)的模擬器和GDB調(diào)試窗口的截圖。
這個(gè)例子中我調(diào)試的程序使用以下代碼,并使用-g參數(shù)編譯:
#include
#include
volatile int frame = 0;
//---------------------------------------------------------------------------------
void Vblank() {
//---------------------------------------------------------------------------------
frame++;
}
//---------------------------------------------------------------------------------
int main(void) {
//---------------------------------------------------------------------------------
touchPosition touchXY;
irqSet(IRQ_VBLANK, Vblank);
consoleDemoInit();
iprintf(" Hello DS dev'rs\n");
//iprintf(" \x1b[32mwww.devkitpro.org\n");
//iprintf(" \x1b[32;1mwww.drunkencoders.com\x1b[39m");
iprintf("\n blog.congao.net\n");
iprintf(" Vincent(c_gao)'s Blog");
while(1) {
swiWaitForVBlank();
touchRead(&touchXY);
// print at using ansi escape sequence \x1b[line;columnH
iprintf("\x1b[10;0HFrame = %d",frame);
iprintf("\x1b[16;0HTouch x = X, X\n", touchXY.rawx, touchXY.px);
iprintf("Touch y = X, X\n", touchXY.rawy, touchXY.py);
}
return 0;
}
2.3.3 DDD功能的使用
DDD (Data Display Debugger)是一個(gè)圖形化調(diào)試前端工具,其本身沒有調(diào)試功能,需要配合GDB一起使用。Linux系統(tǒng)下安裝DDD非常方便,但在Mac OS X下就比較麻煩。首先講解如何在Mac OS X下如何安裝DDD,對于Linux系統(tǒng)這部分內(nèi)容可以省略。
OS X上安裝DDD
DDD是標(biāo)準(zhǔn)的X11應(yīng)用程序,X11和OS X系統(tǒng)之前有著很大關(guān)系,Apple公司專門有一個(gè)項(xiàng)目叫XQuartz,為使X11應(yīng)用程序在OS X系統(tǒng)運(yùn)行作努力。為使DDD能在OS X上運(yùn)行,需要安裝以下兩個(gè)軟件:
(1)XQuartz:OS X 10.7自帶不用裝, 10.9需要另行安裝。
(2)Fink:引用wikipedia的一句話,The Fink project is an effort to port and package open-source Unix programs to Mac OS X.
這里我就不講如何安裝這兩個(gè)軟件了。假設(shè)你已安裝好這兩樣。
Fink使得你可以使用Debian的很多pkg安裝包,還帶了非常有用的ap-get命令。因此,熟悉Linux命令的讀者很容易上手。首先執(zhí)行sudo apt-get update,然后sudo apt-get install ddd,即可完成DDD的安裝。
安裝好DDD后,我們現(xiàn)在使用它來配合DeSmuME調(diào)試程序(而不是命令行的GDB)。安照2.3.1節(jié)DeSmuME準(zhǔn)備就緒后,運(yùn)行如下代碼啟動(dòng)DDD:
ddd --debugger your_path/arm-none-eabi-gdb file_path/hello_world.elf
這里的
(1)第一個(gè)參數(shù)--debugger,指定后面的your_path/arm-none-eabi-gdb作為DDD的調(diào)試用GDB;
(2)第二個(gè)參數(shù)file_path/hello_world.elf為需要被調(diào)試的帶-g編譯出來的elf文件,這和2.3.2節(jié)一樣。
如果輸入沒有錯(cuò)誤,回車進(jìn)入DDD調(diào)試窗口,窗口下方是GDB命令行子窗口。在這個(gè)命令行子窗口內(nèi)同樣輸入以下命:
target remote :2000
此時(shí),DDD內(nèi)的GDB就能連接上模擬器,就可以進(jìn)行圖形化調(diào)試之旅了。圖6是調(diào)試過程載圖:
至此,本篇主要內(nèi)容講完了。
后記:
(1)在OS X 10.9的系統(tǒng)中安裝Fink有點(diǎn)繁雜,但只要仔細(xì)按要求一步步操作就不會(huì)有問題。
(2)我在寫這篇博文時(shí),用的OS X系統(tǒng)自帶的五筆中文輸入法,在按了caps lock鍵后可以轉(zhuǎn)換為英文輸文。但是在這樣的英文輸入狀態(tài)下,命令行啟動(dòng)DDD時(shí),DDD下方的GDB子窗口輸入英文就會(huì)變成亂碼,即使這時(shí)把中文關(guān)了也會(huì)輸入亂碼。最后發(fā)現(xiàn)必需在命令行啟動(dòng)DDD時(shí),輸放法狀態(tài)就得是標(biāo)準(zhǔn)英文輸入狀態(tài)。
(3)我一開始在DDD下方的GDB子窗口中不管輸入什么GDB命令都提示“waiting until GDB gets ready“錯(cuò)誤,后google之后發(fā)現(xiàn)這是DDD的一個(gè)bug,只要按照這篇文章DDD - Bugs: bug #32949, "waiting until GDB gets...,先關(guān)閉DDD,然后修改~/.ddd/init文件內(nèi)的一行:將set extended-prompt not set\n\ 改為 set extended-prompt (gdb) \n\ 最后重啟DDD便可。
請待下篇....







