您好,登錄后才能下訂單哦!
因某種需要,要在Windows平臺上進行程序開發,目標板是基于Micrel芯片(ARMv4t)做的,上面運行有Linux最小系統,只有最基本的命令,需要在Windows平臺上交叉編譯能在ARMv4t上運行的目標代碼,并且還要能進行遠程調試。基于這些需求,初步計劃按以下步驟進行:
1、先在Windows平臺上交叉編譯一個簡單的C語言程序,并上傳到開發板上,能正常運行即可;
2、交叉編譯gdbserver,并上傳到開發板;
3、進行遠程調試。
按上述計劃,首先要找一個Windows環境下的交叉編譯環境,參考了http://www.veryarm.com/arm-none-linux-gnueabi-gcc 下載了arm-2011.03-41-arm-none-linux-gnueabi.exe Windows安裝版(個人感覺在Windows下用安裝版比較好,解壓版需要設定PATH),安裝成功后,用C寫了一個簡單的Hello,World!,使用如下命令進行編譯:arm-none-linux-gnueabi-gcc hello.c -o hello
目標板與Windows主機通過以太網和串口進行連接,以太網用來上傳文件,串口用于進行終端訪問。目標板與Windows主機使用tfpt進行文件傳遞。Windows上運行有tftp server,如下圖:
通過串口終端在目標板上運行如下命令下載Windows主機上編譯的hello程序:tftp -gr hello 10.32.2.10
使用命令chmod 755 hello
添加執行權限后執行時,出現下述錯誤提示:Illegal Instruction
這說明程序能運行,但指令不對,這有可能是在Windows上交叉編譯時沒有指定具體目標架構的原因(在Ubuntu下使用上述命令進行交叉編譯的程序可以正常執行)。為了解決這個問題,首先通過串口終端查看了目標板啟動時的信息,了解到ARM芯片是armv4t架構,接著使用arm-none-linux-gnueabi-gcc --target-help
查看交叉編譯器支持的ARM架構類型,發現該命令通過-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命令,要進行遠程調試,需要在目標板上運行gdbserver。于是上gdb官網(http://ftp.gnu.org/gnu/gdb) 下載gdb7.6的代碼。突然一想,既然arm-2011.03-41-arm-none-linux-gnueabi.exe包含有Windows上執行的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是包含調試信息的被調試程序。然后在Windows下運行arm-none-linux-gnueabi-gdb.exe,進入gdb提示符后后,執行target remote 20.32.2.80:3333就聯上目標板的gdbserver了,然后再在gdb提示符下執行file hello,這個是在Windows下加載被調試的程序,之后就按gdb的命令設置端點等就可以調試了。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。