系統(tǒng)運維
因某種需要,要在windows平臺上進行程序開發(fā),目標板是基于micrel芯片(armv4t)做的,上面運行有l(wèi)inux最小系統(tǒng),只有最基本的命令,需要在windows平臺上交叉編譯能在armv4t上運行的目標代碼,并且還要能進行遠程調(diào)試?;谶@些需求,初步計劃按以下步驟進行:
1、先在windows平臺上交叉編譯一個簡單的c語言程序,并上傳到開發(fā)板上,能正常運行即可;
2、交叉編譯gdbserver,并上傳到開發(fā)板;
3、進行遠程調(diào)試。
按上述計劃,首先要找一個windows環(huán)境下的交叉編譯環(huán)境,參考了http://www.veryarm.com/arm-none-linux-gnueabi-gcc 下載了arm-2011.03-41-arm-none-linux-gnueabi.exe windows安裝版(個人感覺在windows下用安裝版比較好,解壓版需要設(shè)定path),安裝成功后,用c寫了一個簡單的hello,world!,使用如下命令進行編譯:
arm-none-linux-gnueabi-gcc hello.c -o hello
目標板與windows主機通過以太網(wǎng)和串口進行連接,以太網(wǎng)用來上傳文件,串口用于進行終端訪問。目標板與windows主機使用tfpt進行文件傳遞。windows上運行有tftp server,如下圖:
通過串口終端在目標板上運行如下命令下載windows主機上編譯的hello程序:
tftp -gr hello 10.32.2.10
使用命令chmod 755 hello添加執(zhí)行權(quán)限后執(zhí)行時,出現(xiàn)下述錯誤提示:
illegal instruction
這說明程序能運行,但指令不對,這有可能是在windows上交叉編譯時沒有指定具體目標架構(gòu)的原因(在ubuntu下使用上述命令進行交叉編譯的程序可以正常執(zhí)行)。為了解決這個問題,首先通過串口終端查看了目標板啟動時的信息,了解到arm芯片是armv4t架構(gòu),接著使用arm-none-linux-gnueabi-gcc --target-help查看交叉編譯器支持的arm架構(gòu)類型,發(fā)現(xiàn)該命令通過-march=option可以指定目標類型,于是,編譯命令改為:
arm-none-linux-gnueabi-gcc -march=armv4t hello.c -o hello -g
編譯成的程序在目標機上能夠運行?。ㄟ\氣不錯)
第一步完成,接下來交叉編譯gdbserver。先前安裝的arm-2011.03-41-arm-none-linux-gnueabi.exe包含有在windows下運行的arm-none-linux-gnueabi-gdb.exe命令,要進行遠程調(diào)試,需要在目標板上運行g(shù)dbserver。于是上gdb官網(wǎng)(http://ftp.gnu.org/gnu/gdb) 下載gdb7.6的代碼。突然一想,既然arm-2011.03-41-arm-none-linux-gnueabi.exe包含有windows上執(zhí)行的gdb,那是不是也包含有在linux上運行行的gdbserver呢?進入安裝目錄一搜索,bingo,果然有,在安裝目錄codesourcery\\\\sourcery_g _lite\\\\arm-none-linux-gnueabi\\\\libc\\\\armv4t\\\\usr\\\\bin下,運氣不錯。把該目錄下的gdbserver放到目標版上后,果真能運行。第二步完成(俺有時還是比較懶的,在windows下就不再自己編譯了)
第三步就相對容易了,在目標板上運行命令啟動gdbserver:
./gdbserver 10.32.2.80:3333 hello
上述命令中的ip是目標板自己的ip地址,端口號自己指定,只要不沖突就行,后面的hello是包含調(diào)試信息的被調(diào)試程序。然后在windows下運行arm-none-linux-gnueabi-gdb.exe,進入gdb提示符后后,執(zhí)行target remote 20.32.2.80:3333就聯(lián)上目標板的gdbserver了,然后再在gdb提示符下執(zhí)行file hello,這個是在windows下加載被調(diào)試的程序,之后就按gdb的命令設(shè)置端點等就可以調(diào)試了。