天天看點

Ubuntu下搭建ARM彙編線上調試環境

要學習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的位址等等問題還需要進一步學習了解.

繼續閱讀