S3C6410開發時使用:前端軟件(ADS)+仿真器(JLink)的方式。
JLink與前端軟件(AXD)相連時,需要使用調試代理,所有PC機需要安裝Jlink驅動。
S3C6410的前端軟件採用ADS,ADS中含有AXD調試工具。
調試方法:
1、JLink V8連接S3C6410之後,一開始出現不能識別的core,等待一會兒之後,能識別到ARM11。
爲什麼能用Jlink調試CPU,這是CPU內部集成的調試接口所具有的特性,這樣用戶只要使用簡單的仿真器,就能實現對CPU的調試,爲用戶節省了很多的經費。JLink調試CPU時,與前端軟件AXD相連時,需要調試代理,這個需要了解,雖然這個不需要開發人員自己設計,由JLink驅動幫助你完成好了。
2、用AXD調試CPU時,需要對CPU進行初始化,具體初始化的工作包括:關看門狗、初始化中斷、初始化Flash、初始化SDRAM等。經過這些操作之後,AXD才能加載程序到內存,才能正常對CPU調試。
3、爲了簡化操作,我們可以使用S3C6410的Nand中的u-boot來實現對CPU的初始化,具體使用方法:開發板的撥碼開關開到非S2的一側,打開JLink GDB軟件,給S3C6410上電,在串口阻止系統啓動Linux,只停留在uboot階段,打開AXD,打開File->Load Image,加載裸驅的.axf文件,設置斷點在main函數處,開始運行。
4、其實用uboot完成初始化只是爲了省事,專業的用AXD調試uboot方法如下:
一、打開JLink GDB等待,直到識別到ARM11;
二、打開AXD,打開System Views->Command Line Interface窗口,在Debug命令窗口輸入如下命令:
Debug->ob c:/init.txt
Debug->lb c:/u-boot.bin 0x50001000
Debug->setpc 0x50001000
Debug->run
其中init.txt內容如下,需去除註釋:
fillmem 0x7e004000 0x7e004000 0x00000000 32
/*關看門狗*/
fillmem 0x71200014 0x71200014 0x00000000 32
/*若以前設置了阻止某個中斷,現在全部清除*/
fillmem 0x71300014 0x71300014 0x00000000 32
/**/
fillmem 0x7120000C 0x7120000C 0x00000000 32
/*選擇所有的中斷爲IRQ中斷*/
fillmem 0x7130000C 0x7130000C 0x00000000 32
fillmem 0x71200F00 0x71200F00 0x00000000 32
/*該寄存器包含當前中斷服務程序的地址ISR,默認爲0。讀取該寄存器返回一個ISR並設置當前中斷已經被服務了,讀取必須在有真的中斷來臨的時候才能讀取。寫該寄存器會清除當前中斷,所以寫該寄存器必須在中斷服務例程結束時才能寫。*/
fillmem 0x71300F00 0x71300F00 0x00000000 32
fillmem 0x7e00f900 0x7e00f900 0x0000801e 32
/*others control register設置爲默認值*/
fillmem 0x7e00f000 0x7e00f000 0x0000ffff 32
fillmem 0x7e00f004 0x7e00f004 0x0000ffff 32
/*MPLL設置爲要求週期產生靜態時鐘輸出*/
fillmem 0x7e00f020 0x7e00f020 0x01043310 32
/*選擇時鐘分頻值CLK_DIV0,CLK_DIV0控制系統時鐘和多媒體IPs的特殊時鐘*/
fillmem 0x7e00f00C 0x7e00f00C 0xc2150601 32
/*控制APLL輸出頻率*/
fillmem 0x7e00f010 0x7e00f010 0xc2150601 32
/*控制MPLL輸出頻率*/
fillmem 0x7e00f024 0x7e00f024 0x00000003 32
/*選擇時鐘分頻值CLK_DIV0*/
fillmem 0x7e00f014 0x7e00f014 0x00200102 32
/*控制EPLL輸出頻率*/
fillmem 0x7e00f018 0x7e00f018 0x00000000 32
/*控制EPLL輸出頻率*/
fillmem 0x7e00f01C 0x7e00f01C 0x14000007 32 /*選擇時鐘源*/
fillmem 0x7e00f120 0x7e00f120 0x00000008 32 /*NAND系統配置寄存器*/
fillmem 0x7e001004 0x7e001004 0x00000004 32 /*32bit DRAM:命令爲配置*/
fillmem 0x7e001010 0x7e001010 0x0000040f 32 /*32bit DRAM:刷新週期reg*/
fillmem 0x7e001014 0x7e001014 0x00000006 32 /*32bit DRAM:CAS延時reg*/
fillmem 0x7e001018 0x7e001018 0x00000001 32 /*32bit DRAM:t_DQSS*/
fillmem 0x7e00101c 0x7e00101c 0x00000002 32 /*32bit DRAM:t_MRD*/
fillmem 0x7e001020 0x7e001020 0x00000006 32 /*32bit DRAM:t_RAS*/
fillmem 0x7e001024 0x7e001024 0x0000000a 32 /*32bit DRAM:t_RC*/
fillmem 0x7e001028 0x7e001028 0x0000000c 32 /*32bit DRAM:t_RCD*/
fillmem 0x7e00102c 0x7e00102c 0x0000018f 32 /*32bit DRAM:t_RFC*/
fillmem 0x7e001030 0x7e001030 0x0000000c 32 /*32bit DRAM:t_RP*/
fillmem 0x7e001034 0x7e001034 0x00000002 32 /*32bit DRAM:t_RRD*/
fillmem 0x7e001038 0x7e001038 0x00000002 32 /*32bit DRAM:t_WR*/
fillmem 0x7e00103c 0x7e00103c 0x00000002 32 /*32bit DRAM:t_WTR*/
fillmem 0x7e001040 0x7e001040 0x00000002 32 /*32bit DRAM:t_XP*/
fillmem 0x7e001044 0x7e001044 0x00000013 32 /*32bit DRAM:t_XSR*/
fillmem 0x7e001048 0x7e001048 0x00000013 32 /*32bit DRAM:t_ESR*/
fillmem 0x7e00100C 0x7e00100C 0x0001001a 32 /*內存配置reg*/
fillmem 0x7e00104C 0x7e00104C 0x00000b45 32 /*DRAM控制口配置*/
fillmem 0x7e001200 0x7e001200 0x000150f0 32 /*chip-<n>-cfg reg*/
fillmem 0x7e001304 0x7e001304 0x00000000 32 /*user_cfg reg*/
fillmem 0x7e001008 0x7e001008 0x000c0000 32 /*direct command reg*/
fillmem 0x7e001008 0x7e001008 0x00000000 32
fillmem 0x7e001008 0x7e001008 0x00040000 32
fillmem 0x7e001008 0x7e001008 0x00040000 32
fillmem 0x7e001008 0x7e001008 0x000a0000 32
fillmem 0x7e001008 0x7e001008 0x00080032 32
fillmem 0x7e001004 0x7e001004 0x00000000 32
去除註釋之後的文件如下:
fillmem 0x7e004000 0x7e004000 0x00000000 32
fillmem 0x71200014 0x71200014 0x00000000 32
fillmem 0x71300014 0x71300014 0x00000000 32
fillmem 0x7120000C 0x7120000C 0x00000000 32
fillmem 0x7130000C 0x7130000C 0x00000000 32
fillmem 0x71200F00 0x71200F00 0x00000000 32
fillmem 0x71300F00 0x71300F00 0x00000000 32
fillmem 0x7e00f900 0x7e00f900 0x0000801e 32
fillmem 0x7e00f000 0x7e00f000 0x0000ffff 32
fillmem 0x7e00f004 0x7e00f004 0x0000ffff 32
fillmem 0x7e00f020 0x7e00f020 0x01043310 32
fillmem 0x7e00f00C 0x7e00f00C 0xc2150601 32
fillmem 0x7e00f010 0x7e00f010 0xc2150601 32
fillmem 0x7e00f024 0x7e00f024 0x00000003 32
fillmem 0x7e00f014 0x7e00f014 0x00200102 32
fillmem 0x7e00f018 0x7e00f018 0x00000000 32
fillmem 0x7e00f01C 0x7e00f01C 0x14000007 32
fillmem 0x7e00f120 0x7e00f120 0x00000008 32
fillmem 0x7e001004 0x7e001004 0x00000004 32
fillmem 0x7e001010 0x7e001010 0x0000040f 32
fillmem 0x7e001014 0x7e001014 0x00000006 32
fillmem 0x7e001018 0x7e001018 0x00000001 32
fillmem 0x7e00101c 0x7e00101c 0x00000002 32
fillmem 0x7e001020 0x7e001020 0x00000006 32
fillmem 0x7e001024 0x7e001024 0x0000000a 32
fillmem 0x7e001028 0x7e001028 0x0000000c 32
fillmem 0x7e00102c 0x7e00102c 0x0000018f 32
fillmem 0x7e001030 0x7e001030 0x0000000c 32
fillmem 0x7e001034 0x7e001034 0x00000002 32
fillmem 0x7e001038 0x7e001038 0x00000002 32
fillmem 0x7e00103c 0x7e00103c 0x00000002 32
fillmem 0x7e001040 0x7e001040 0x00000002 32
fillmem 0x7e001044 0x7e001044 0x00000013 32
fillmem 0x7e001048 0x7e001048 0x00000013 32
fillmem 0x7e00100C 0x7e00100C 0x0001001a 32
fillmem 0x7e00104C 0x7e00104C 0x00000b45 32
fillmem 0x7e001200 0x7e001200 0x000150f0 32
fillmem 0x7e001304 0x7e001304 0x00000000 32
fillmem 0x7e001008 0x7e001008 0x000c0000 32
fillmem 0x7e001008 0x7e001008 0x00000000 32
fillmem 0x7e001008 0x7e001008 0x00040000 32
fillmem 0x7e001008 0x7e001008 0x00040000 32
fillmem 0x7e001008 0x7e001008 0x000a0000 32
fillmem 0x7e001008 0x7e001008 0x00080032 32
fillmem 0x7e001004 0x7e001004 0x00000000 32
5、AXD命令使用方法如下
打開AXD,按下 Alt + L ;或者點System Views下Command Line Interface,就可以打開一個命令行:
輸入help查看幫助文件。
比較有用的命令如:
loadbinary : 將一個文件導入RAM ,簡寫爲lb
loadsymbols : 導入符號表
setpc : 設置PC指針
run : 開始運行
ob + 文件名 : 按照批處理文件運行
批處理文件所有的命令在GUI裏面也是有的,可以利用批處理文件(ob命令)來免去敲命令和點菜單的麻煩,以調試u-boot爲例,寫一個批處理文件放在c盤,文件名爲init.txt,內容如下:
ob c:/init.txt
lb c:/u-boot.bin 0x50001000
setpc 0x50001000
run
axf文件的獲取:
在linux下編譯u-boot後,有一個u-boot文件,把它改名爲u-boot.axf即可!
loadbinary簡寫lb,只能將二進制文件加載到ram中,不能將地址指定到flash中
在loadsymbols之後,等待進度條顯示加載完成,將setpc (pc)指到u-boot.bin的加載位置,即可單步調試。
這時ads會提示尋找u-boot的入口文件start.s地址,此時需要手動指定start.s的位置,通常這時可以在linux下建立smaba服務共享,將整個u-boot的文件夾映射成windows下一個盤符,這樣就可以指定目錄地址了。
在進入c語言代碼中後,ads還可能出現提示指定board.c、string.c等其他文件的地址,這都需要手動做。
此後就可以用ads進行c語言級的u-boot源碼調試了!
用ADS 1.2的AXD Debugger調試在Linux下面編譯出來的Uboot
給板子上電,如果Nand Flash裏面沒有程序,那麼板子沒跑起來,真是我們要的。如果Flash裏面有uboot,uImage,rootfs,而板子已經運行了。那麼就要弄個可以有delay的uboot,這樣可以按s,使得uboot停止去load Linux的kernel
1.將硬件JTAG與板子連接好。
2.給板子上電,按s停止uboot的運行
3.啓動AXD Debugger
4.打開 File -> Load Memory From File
裝載u-boot.bin 到地址0x0處.如果不行,可以嘗試先裝載u-boot,然後再裝載u-boot.bin.
5.裝載完成後,右鍵點擊彙編代碼的那個窗口,選擇SetPC,設置PC爲0
6.點擊運行,即可運行uboot了。