要學習ARM的彙編,需要實際檢視相關寄存器和存儲器的内容,為此我選擇了JLink+JLinkGDBServer+arm-linux-gdb/insight的方案調試彙程式設計式.
ubuntu14.04下安裝JLink方面的軟體還算順利,安裝gdb前端insight時就苦了,make後出現錯誤,解決不了.後來換了最新的insight-6.8-1a,配置後make,好了一點,不需要像網上一樣修改makefile等,但一樣會提示錯誤,好像是說沒有安裝x11庫什麼的,安裝x11時用源碼方式安裝,太多依賴檔案行不通,,後來用apt-get的方式安裝也提示很多依賴檔案沒有安裝.更新源後也不行.後來ubuntu系統提示更新,更新完後重新開機居然可以通過X11這一關了,但又提示error: No termcap library found.找了一下方法:
apt-cache search ncurses
apt-get install libncurses5-dev
主要注意幾個點:
1.libx11-dev libncurses5-dev libc6-dev這些是需要預先安裝的
2.修改/gdb/gdbtk/libaray/targetselection.itb,查找1000,将其修改為2331;
3../configure --target=arm-linux -prefix=/opt/arm_insight --disable-werror
禁止警告錯誤很重要,不然提示很多錯誤。總算成功build出arm-linux-gdb 和arm-linux-insight來了.
出來後問題又來了:怎麼用JLink調試?
打開JLinkGDBServer和insight後發現insight的端口為1000不能修改,網上很多方法,我這修改了GDBServer :JLinkGDBServer -port 1000 連接配接上後我直接按insight裡面的指令單步按鈕,發現顯示"Select function name to disassemble",反正不能像VC那樣看着界面運作,我按下"Ctrl + N"彈出指令行形式輸入"ni"發現顯示"0x30001174 in ??()"這樣奇怪的字元,說明還不能線上仿真.後來我下載下傳了官方的UM08005_JLinkGDBServer.pdf手冊(點選打開)發現需要download後才能線上仿真調試,單步調試可以看到LED燈亮度的變化.但還不清楚怎麼将手冊裡的腳本與insight聯系起來.按照文檔可以寫出這樣的GDB腳本:
define initfun
monitor endian little #little endian.
monitor reset #reset
monitor reg cpsr = 0xd3 #cpsr register.
monitor speed 1000 #Speed 1000kHz.
monitor MemU32 0x53000000 = 0 #disable watchdog
load /home/default/Desktop/init/led_off_elf 0x30000000
end
define bootfun
target remote $arg0:$arg1 #arg0 = ip,arg1=port
initfun
end
開發闆啟動選擇Nand Flash,打開GDBServer,shell上輸入"arm-linux-gdb -x /home/default/Desktop/gdbinit -ex "bootfun 127.0.0.1 1000" /home/default/Desktop/init/led_off_elf":"
其中測試程式init是點亮兩個LED燈.
.text
.global _start
_start:
LDR R0,=0x56000010
MOV R1,#0x00015400
STR R1,[R0]
LDR R0,=0x56000014
MOV R1,#0xdf
STR R1,[R0]
MAIN_LOOP:
B MAIN_LOOP
</code>
Makefile是:
led_off.bin : led_off.S
/usr/gcc-arm-none-eabi-4_7-2013q3/bin/arm-none-eabi-gcc -g -c -o led_off.o led_off.S
/usr/gcc-arm-none-eabi-4_7-2013q3/bin/arm-none-eabi-ld -Ttext 0x0000000 -g led_off.o -o led_off_elf
/usr/gcc-arm-none-eabi-4_7-2013q3/bin/arm-none-eabi-objcopy -O binary -S led_off_elf led_off.bin
clean:
rm -f led_off.bin led_off_elf *.o
發現能簡單初始化
,并燒寫到了0x30000000上,可以先設定斷點譬如"b 4",然後"c"運作到斷點處,"ni"指令單步運作.在insight這些操作比較簡單,譬如,下斷點直接用圖形界面點選即可,下載下傳的話滑鼠點選run->download即可下載下傳,但還沒搞清楚下載下傳到什麼位址去,因為我把啟動開關撥到NOR Flash上時不能調試,撥到Nand Flash上download後按下"ni"卻可以單步了.gdb的運用還不熟練(GDB線上文檔),mini2440的SDRAM位址空間配置,link彙編時指定的位址,insight預設download的位址等等問題還需要進一步學習了解.