【原創】Jlink在ADS下的配置說明及常見問題解決辦法


Jlink在ADS下的配置說明及常見問題解決辦法Zhaoxj

參考文檔:

*1、TQ2440開發板使用手冊V3.2_20121203.pdf

2、JLINK ADS 2440.pdf

注:1、本說明是針對S3C2440而寫的。其他的配置基本一樣,就是型號要改。我會在文章中說明,反正出現的問題都差不多。

2、針對裸板開發及筆記本的J-Link與開發板的連接及配置的一些問題進行總結跟解決。裸機下開發軟件用的是ARM Developer Suite v1.2(ADS)。

3、重點在於JLink 的配置問題上,把我遇到的問題說明,歡迎補充!

 

最近搞了好幾天的J-Link調試,找開發板的技術也沒解決。在網上找了好多人家的經驗。把自己一步一步的問題都解決了。其實還是卡在了最后一步上,網上也搜不到這樣的問題,估計也是偶然性的問題,最后算是憑着運氣搞定了吧。無比欣喜。我想對S3C2440用ADS開發及J-Link調試下的一些注意點做一下總結,也希望對看到的人有所幫助。歡迎分享!

 

一、編譯源代碼、生成bin

軟件:ADS1.2 很簡單,沒什么要注意的。最后破解一下就可以。裝完后在開始菜單下有一個ARM Developer Suite v1.2目錄,打開,我們用的是里面的第一AXD Debugger(AXD)跟第二個CodeWarrior for ARM Developer Suite(IDE),IDE就是源代碼編譯生成bin的。

1、  IDE相關配置

a、新建工程,選可執行鏡像。再新建或直接添加代碼。代碼的管理也很簡單。

*b、建好的工程下有一個***.mcp(mcp是工程名,以后直接打開它即可,也可以直接拖拽)的窗口,點擊DebugRel Setting(我們這里默認的是DebugRel,生成的bin文件也在那里面)

                       

 

在彈出的設置對話框里做如下設置:

1、  Target->Target Setting要改Post-Linker(ARM  fromELF)

 

 

2、Language  Setting 里都改成ARM920T,其他型號的內核也做相應的改動。,默認是ARM7內核。

 

*3、Linker->ARM Linker在output選項卡中RO base改成0x30000000,Option選項卡中Image entry point改成0x30000000,Layout選項卡中Object/Symbol(2440init.0),Section(Init),Listing(List.txt)

 

 

 

 

 

 

點OK,配置好了!

c、接着點圖標邊上手寫字的按鈕,代表編譯文件。如果沒有錯誤則編譯通過,生成bin文件。

 

注:*對於含中文路徑的.mcp文件不能直接打開。

*對於提示路徑錯誤的嘗試點project->remove object code,再重新編譯。

   *想重新編譯生成bin可以直接把工程目錄下的.axf和.bin刪掉。

 

二、     用JLink直接下載bin

a、安裝SEGGERE,打開J-FLASH ARM,並配置(參考《TQ2440開發板使用手冊V3.2》中“S3C2440裸機程序的開發步驟”一節)

b、連接好JLink並給開發板上電,JFlash軟件中點擊Target->Connect,再點擊Open打開bin文件,點擊Target->Program.

c、關掉開發板電源,斷開Jlink與開發板的連接,並啟動開發板。

    注:下載到nand和nor中都可以,建議nor中,nand有位反轉的問題。

(也有人說nor速度慢之類的。具體下載到nand跟nor有點不懂,有什么代碼拷貝的問題,還有SDRAM什么的,下次有時間再查一下)

 

*三、用JLink配合AXD單步調試及運行

    注:我自己碰到了打不開AXD的問題,用管理員身份運行ADS1.2就行了。

點擊ADS配置按鈕旁邊的Debug(有個小蟲子的圖標),啟動AXD。

在TQ的教程中把SEGGER安裝配置好。然后把JLinkRDI.dll在options->configTarget設置中添加,點擊config或雙擊,在CPU選項中把Allow …前面鈎去掉,Little跟選擇no reset。

 

 

這樣才算正常。

 

然后是最關鍵的一步

添加2440init.txt文件

Setmem 0x53000000 0x00000000 32

Setmem 0x4A000008 0xFFFFFFFF 32

Setmem 0x4A00001C 0x000007FF 32

Setmem 0x53000000 0x00000000 32

Setmem 0x56000050 0x000055AA 32

Setmem 0x4C000014 0x00000007 32

Setmem 0x4C000000 0x00FFFFFF 32

Setmem 0x4C000004 0x00061012 32

Setmem 0x4C000008 0x00040042 32

Setmem 0x48000000 0x22111120 32

Setmem 0x48000004 0x00002F50 32

Setmem 0x48000008 0x00000700 32

Setmem 0x4800000C 0x00000700 32

Setmem 0x48000010 0x00000700 32

Setmem 0x48000014 0x00000700 32

Setmem 0x48000018 0x0007FFFC 32

Setmem 0x4800001C 0x00018005 32

Setmem 0x48000020 0x00018005 32

Setmem 0x48000024 0x008E0459 32

Setmem 0x48000028 0x00000032 32

Setmem 0x4800002C 0x00000030 32

Setmem 0x48000030 0x00000030 32

 

在Option->configure interface下的session file下點browse選擇文件。

Option->processer我是沒改,看到有說把semihosting鈎去掉的,還有說點一下clear all的。暫時先不管。

 

注:我遇到的最關鍵的兩個問題是:

1、CPU型號修改的問題

在options->configTarget中雙擊或config  ARMUL把variant中設置為ARM920T,與ADS中一致。

2、無法運行的問題

就是搞了好幾天的問題,最后根據提示在options->configTarget中ADD了一個JLinkARM.dll然后彈出了下面的對話框就OK了!

3、注意添加文件中文路徑的問題!

 

 

其他常見問題(摘自網友,供參考,感謝!):

1問題描述:用AXD+jlink調試程序時(開發板為mini2440),每調試一步發現發現相應寄存器的值沒有半點改變。(前提已經添加了jlinkRDI.all文件,configuration為默認配置)
(在網上百度了查了一下,說默認配置就可以了,還有很多別的配置方法都說可行,但菜鳥我試過都不可以(可能僅對於我的情況),后面偶然找到飛凌FL2440給的文檔中給的配置方法,試了一下果真可以了)
解決方法:1.添加jlinkRDI.all文件后,點擊configure按鈕。
2.選擇CPU項,Allow sturction set simulation這里把勾去掉,同時選擇小端模式(little endian),再到Reset strategy的選項里選擇 No reset項,確定,重啟即可
配置貼圖如下:

 

 

 

2總算找到原因了:

首先,打開4.02d 的jlink gdb server,最好設置通訊方式是Big endian(不知道為什么選little endian在調試時候比較容易跑飛-_-)

 

然后,斷掉板子的電源,打開AXD(如果卡死在開啟界面,就用任務管理器結束AXD的進程后重新啟動吧,再啟動后一般能行的)

 

這步是關鍵,進入AXD,由於沒有沒有檢測到multi-ice會報錯,這里不用理會它,在報錯的界面,連接方式一定要選擇NOHALT(或者進入 option -> configure interface 一定要NOHALT),不然會卡死在這里不停地loading target,或者在load鏡像的時候會不停loading image。

 

板子重新上電,然后再按一下復位鍵,讓板子在uboot的狀態。 重新configure target, 選multi-ice 就是我們的jlink 4.02的rdi之后加載鏡像就可以調試了^-^。

 

3、完整的解決辦法。

第一. 使用 ADS 的 CodeWarrior 編譯。使用 CodeWarrior 編譯首先要新建工程,然后新建 C 后者匯編文件,添加文件要工程,然后要編譯的問題了,

       單獨對 C 和匯編源文件進行編譯,然后再使用 make 連接成一個可執行文件,不編譯直接 make 會出現一些文件找不到,變量沒定義的問題。

 

第二.可執行文件也就是 BIN 文件,這里說的是裸機程序,

       下載到 Nand Flash 中的前 4k 中,(關於為什么是到 NandFlansh ,注意文件大小要小於 4k ,這里不多說,可以上網搜索網上比較多),

       注意 2440 板啟動是從 NorFlash 啟動。注意這樣下載的裸機程序因為沒有操作系統所以需要一段匯編的啟動代碼去初始化堆棧,寄存器,中斷向量表, C 語言環境等等

       具體我也不是很清楚,需要的話網上很多分析啟動代碼的。啟動代碼編譯后和 C 源文件一起連接成一個可執行文件,下載到板之里執行。

 

第三. CodeWarrior 設置,這里是最重要的步驟,打開 CodeWarrior ,選擇 Edit 菜單,打開 DebugRel Settings ,

       第一個 Target Settings –> Post-linker 選擇 ARM fromELF ,

       第二個設置 Language Settings->ARM Assembler(ARM 匯編器 ) 選擇對應的 ARM 板型號, mini2440 對應 ARM920T ,

       相應的設置好 C 編譯器,如果要用到 C++ 同樣要設置好。第三個設置的地方 Linker->ARM Linker 這個比較關鍵,

       開始我一直沒設置好的地方就是這里,因為手冊上還是看別人的設置都沒有說到,我一個人弄了好幾天。

       好了說重點,

       ARM Linker 中選擇 Output 在 RO Base 下選擇地址 0x30000000 不同的 ARM 板可能不同,手冊上應該會給出,

       這個地址就是 SDRAM 的開始地址。然后選擇 Options 選項在 Image entry point 中輸入 0x30000000 ,

       繼續選擇 Layout 選項,在 Object/Symbol 中輸入你的初始化目標文件,

       2440init.o 在旁邊的 Section 中輸入 Init ,最好 Listings 選項,這個應該可以不用,不過我沒試驗,先填一下落,

       在 Listings->Image map 前打上勾, List file 中填一個 txt 文件,如 list.txt, 到這里這個大選擇就弄好了,

       繼續下面的, ARM fromELF 中 Output format 中選擇輸出文件格式,選擇 Plain binary 可執行的二進制文件,

       注意下面 Output file name 要自己寫一個 .bin 文件,如 led.bin 。如果這里不寫文件名將找不到 bin 文件。現在 CodeWarrior 就設置好了。

 

第四. 第四如果要調試的會,還要初始化 SDRAM ,初始化 SARAM 的代碼如下

 

           Setmem 0x53000000 0x00000000 32

           Setmem 0x4A000008 0xFFFFFFFF 32

           Setmem 0x4A00001C 0x000007FF 32

           Setmem 0x53000000 0x00000000 32

           Setmem 0x56000050 0x000055AA 32

           Setmem 0x4C000014 0x00000007 32

           Setmem 0x4C000000 0x00FFFFFF 32

           Setmem 0x4C000004 0x00061012 32

           Setmem 0x4C000008 0x00040042 32

           Setmem 0x48000000 0x22111120 32

           Setmem 0x48000004 0x00002F50 32

           Setmem 0x48000008 0x00000700 32

           Setmem 0x4800000C 0x00000700 32

           Setmem 0x48000010 0x00000700 32

           Setmem 0x48000014 0x00000700 32

           Setmem 0x48000018 0x0007FFFC 32

           Setmem 0x4800001C 0x00018005 32

           Setmem 0x48000020 0x00018005 32

           Setmem 0x48000024 0x008E0459 32

           Setmem 0x48000028 0x00000032 32

           Setmem 0x4800002C 0x00000030 32

           Setmem 0x48000030 0x00000030 32

 

把上面的代碼粘貼帶記事本中,並把名字重命名為一個 .iniz 的配置文件放在調試文件 .axf 同目錄下。啟動 CodeWarrior 並編譯鏈接后按調試后,按 Alt + L 快捷鍵彈出 AXD 命令窗口,輸入 ob ( obey ) name.ini 執行,這個你可以不這樣只有你調試文件前執行了初始化文件 name.ini 。執行后選擇 file 下的重新裝載當前文件,就可以調試了。

 

遇到的問題

 

1. Failed initailizing heap region 。使用超級終端和 DNW 下載程序后( led.c )超級終端顯示初始化堆棧失敗,

       解決辦法,上面的第三步沒有設置好,設置好第三步就沒有問題了。

 

2. Processor ARM79_0 raised an exception.Cause: The processor was reset 。

       這個問題需要設置 SEGGER J-link RDI V4.081 Status 中的 Congfiguration 中的 CPU 選項選擇第一個不在重啟 NO reset ,不過好像把問題 3 解決后這個問題也沒有了。

       先解決問題三。

 

3. Processor ARM79_0 raised an exception.Cause: Undefined instruction 。這個問題非常惱火,困擾我好久

       解決辦法上面步驟第四步。

 

4. 'c:/documents and settings/****/default-1-2-0-0.ses' could not be loaded 。這個問題是關於ADS 文件最好不要帶中文路徑。

       重新加載動態鏈接文件就是那個。Dll 的文件,一般使用前你都會加載的。下面地址有詳細介紹。

       http://hi.baidu.com/jialaolian629/blog/item/12d0981102756429dd5401eb.html

 

4今天添加文件的時候突然彈出“ at least one file could not be added to the selected targets ”一時我還以為是工程建錯了后來上網搜了一下,發現是因為工程里已經添加了文件,重復添加文件錯誤。當然還可能是其他原因,但一般是因為文件重復添加到一個工程。

 

 

 

“Processor ARM920T raised an exception.Cause:The processor was reset”,這是“debug”后經常出現的問題。

 

 

解決方法:在AXD的命令行模式下(命令行模式:Alt+L),輸入 obey d://ARM2410.txt(路徑),回車,執行GO,再執行STOP,退出AXD,重進入AXD即可進入正常的調試狀態了。

 

 

該文件信息:

 

 

初始化文件:ARM2410.txt

 

 

功能:加載調試文件前自動初始化系統時鍾及SDRAM控制器等等

 

 

使用方法:

    先將ARM2410.txt復制到ADS安裝目錄的bin目錄下;

    在ADS中單擊“Debug”按鈕啟動AXD調試環境,先不要運行程序;

    在AXD中打開“Options”-->“Configure Interface”菜單,在彈出的Configure Interface窗口

中選擇“Session file options”頁,選中“Run Configuration Script”項,然后單擊“Browse...”命

令按鈕去選擇(ADS安裝目錄bin目錄下的)ARM2410.txt文件,確定退出AXD即可。

 

 

5如何禁止軟件中斷時的提示?

    這需要在AXD中關閉“半主”調試。在AXD中打開“Options”-->“Configure Processor...”菜單,在

彈出的窗口中將“Semihosting”項的選擇去掉即可。

 

 

 

 

注:實驗中,由於EasyJtag不能使用,故使用**AG仿真器來仿真,其配置方法如下:

安裝H-JTAG V0.2;

先運行H-Jtag server,然后打開AXD仿真環境,Options----Config Target選擇H-Jtag安裝目錄下的H-Jtag.dll;

File----Load Image,然后就可以在線仿真調試了。

 

1)JLINK在AXD中調試的配置

使用ADS1.2的時候進入AXD調試環境回出現“ the session file could not be loaded”

 

解決方案:1:將工程文件放在不包含中文路徑的目錄下。

 

  2:設置AXD->confing Interface 中general中的save and load default session前面的選項去掉。

 

一:在AXD->options ->configure interface 中的session file 中載入初始化文件,具體內如如下:

 

Setmem  0x53000000 0x00000000  32

 

Setmem  0x4A000008 0xFFFFFFFF  32

 

Setmem  0x4A00001C 0x000007FF  32

 

Setmem  0x53000000 0x00000000  32

 

Setmem  0x56000050 0x000055AA  32

 

Setmem  0x4C000014 0x00000007  32

 

Setmem  0x4C000000 0x00FFFFFF  32

 

Setmem  0x4C000004 0x00061012  32

 

Setmem  0x4C000008 0x00040042  32

 

Setmem  0x48000000 0x22111120  32

 

Setmem  0x48000004 0x00002F50  32

 

Setmem  0x48000008 0x00000700  32

 

Setmem  0x4800000C 0x00000700  32

 

Setmem  0x48000010 0x00000700  32

 

Setmem  0x48000014 0x00000700  32

 

Setmem  0x48000018 0x0007FFFC  32

 

Setmem  0x4800001C 0x00018005  32

 

Setmem  0x48000020 0x00018005  32

 

Setmem  0x48000024 0x008E0459  32

 

Setmem  0x48000028 0x00000032  32

 

Setmem  0x4800002C 0x00000030  32

 

Setmem  0x48000030 0x00000030  32

 

二:在AXD --〉options -〉configurate processor 把semihosting上的選項去掉  點擊clear all.

 

三:第一次使用ADS時需要在AXD中配置J-LINK,在AXD>OPTION>CONFIGURE TARGET里選擇J-LING的安裝目錄下的JLinkRDI.dll,然后點擊CONFIGURE配置,將芯片的復位時間選為2000ms即可正常調試.

 

#########################################################################

 

                                     

配置J-Link為mini2440燒寫bootloader                                  

 

用J-Link其實不配置也能燒,只不過速度超慢

 

因為啥,因為不是在板子的內存里運行的。

 

初學者可能不會配置J-Flash,可以參考我的配置文件(慎用,燒BIOS容易出問題)。

 

【DownUrl】 J-Link燒寫mini2440 BIOS配置文件

 

-----------------------------------------------------------------------------------------------------------------

 

自己配置的話,基本配置如下,主要是要參考光盤里帶的init script,自己填入初始化選項中。

 

配置的主要過程如下:

 

菜單:[Options]-->[option settings]

 

1. Gneral : Connectioin to J-link --> USB : Device 0

 

2. Target Interface : 保持默認設置,不用動

 

3. CPU :

 

Core --> Auto, Little endian

 

Use target RAM(faster)-->Addr:40000000 64KB(主要是這個,不用的話就太慢了)

 

初始化序列(Init sequence)按下面的填,也是從H-Jtag的script扒出來的,我簡單做了下注釋。

 

##-------Action-----Value0------Value1

Setmem 32-Bit 0x53000000 0x00000000 ; pWTCON , 看門狗定時器控制寄存器

Setmem 32-Bit 0x4A000008 0xFFFFFFFF ; INTMSK , 中斷屏蔽寄存器

Setmem 32-Bit 0x4A00001C 0x000007FF ; INTSUBMSK , 針對INTMAK具體化的一個中斷請求屏蔽寄存器

Setmem 32-Bit 0x53000000 0x00000000 ; pWTCON , 看門狗定時器控制寄存器

Setmem 32-Bit 0x56000050 0x000055AA ; rGPFCON , Port F control

Setmem 32-Bit 0x4C000014 0x00000007 ; CLKDIVN , CPU時鍾分頻控制寄存器

Setmem 32-Bit 0x4C000000 0x00FFFFFF ; LOCKTIME , 鎖時計數寄存器

Setmem 32-Bit 0x4C000004 0x00061012 ; MPLLCON , MPLL寄存器

Setmem 32-Bit 0x4C000008 0x00040042 ; UPLLCON , UPLL寄存器

Setmem 32-Bit 0x48000000 0x22111120 ; Bus width & wait status

Setmem 32-Bit 0x48000004 0x00002F50 ; Boot ROM control

Setmem 32-Bit 0x48000008 0x00000700 ; BANK1 control

Setmem 32-Bit 0x4800000C 0x00000700 ; BANK2 control

Setmem 32-Bit 0x48000010 0x00000700 ; BANK3 control

Setmem 32-Bit 0x48000014 0x00000700 ; BANK4 control

Setmem 32-Bit 0x48000018 0x0007FFFC ; BANK5 control

Setmem 32-Bit 0x4800001C 0x00018005 ; BANK6 control

Setmem 32-Bit 0x48000020 0x00018005 ; BANK7 control

Setmem 32-Bit 0x48000024 0x008E0459 ; DRAM/SDRAM refresh

Setmem 32-Bit 0x48000028 0x00000032 ; Flexible Bank Size

Setmem 32-Bit 0x4800002C 0x00000030 ; Mode register set for SDRAM

Setmem 32-Bit 0x48000030 0x00000030 ; Mode register set for SDRAM

 

4. Flash

 

取消"Automatically detect flash memory",然后"Select Flash Device"。

 

mini2440的Flash型號是:SST39VF1601,選中之后不要改寫任何數值。

 

5. Production

 

Erase, Program and Verify enable.

 

 

 

 

6Jlink提示問題:

 

買了個J-LINK仿真器,拿到手就寫了個最經典的程序:跑馬燈。不幸的是不能全速運行,只要全速運行,就提示:“Processor ARM79_0 raised an exception.Cause: The processor was reset”

 

 

 

系統老是自己復位,原以為是ICE那里設置不對,折騰了半天。突然想到watchdog,看了一下數據手冊,在默認情況下watchdog是允許的。。。。把watchog禁止了就可以了。

 

         可以這樣關閉watchdog:

 

         ldr  r0,=0x53000000

 

         mov r1,#0x0

 

         str r1,[r0]

 

 

 

       或者是在jlink RDI中,有一個cpu的選項簽,這個選項簽中的下拉菜單中,選擇noreset。就不會提示這個了。

 

 

 

關於對semihosting的理解

 

    semihosting是在調試器里使用,一旦程序semihosting是在調試器里使用,一旦程序使用semihosting,則代碼(庫函數)直接產生軟件中斷,調用主機上的函數,用於對主機的操作。例如:程序中可以使用printf()函數,當執行該函數時,代碼產生軟件中斷,調試器捕捉到該特定中斷后,調用主機上的函數執行,最后在調試軟件的界面中顯示該函數的結果。換句話說,semihosting提供了與主機的交互功能,方便調試。直接燒到板子里是用不了的,因為沒法與主機通信了。

 

       Semihosting,顧名思義,就是"半主控",意思就是說,運行在target board上的程序利用主機上的facilities的一種程序調試方式,主要是debug目標板時,利用主機的輸入輸出設備,例如在AxD的console上打印相應的調試信息或者用主機的鍵盤輸入相應字符作為target上的程序的輸入。

  C/C++ code默認是可以使用console的,例如,如果只包含C/C++的程序采用ARMulater模擬,就可以直接使用console作為程序的輸出設備;如果程序包含有匯編代碼,要使用主機設備的話,必須采用semihosting SWI方式。Semihosing SWI(以下簡稱SHS),必須有相應的debug agent的支持,才能截獲SHS,並向software debugger(AxD)請求相應的服務,如打印字符或者接受字符輸入,這樣的agents包括:

 1)ARMulater

 2)debug monitor(Angel)

 3)MultiICE

  由於調試裸板或者沒有Angel可以供目標板使用的時候,主要還是要借助仿真器進行調試,所以第三種方式最為常用,下面主要就這種方式進行介紹。當然,UART也是一種最常用的調試接口,但是,使用Semihosting,可以獨立地調試各個硬件模塊的邏輯功能,確保各段代碼正確后再進行集成,相應地省去了每次都要配置UART和另開一個hyperterminal觀察調試信息。所以,我在開發的時候傾向於使用semihosting來調試相關的代碼,這些代碼使用C或者C++編寫,也就是說和硬件配置關系不大。

 

7ARM ADS中的AXD 調試經驗集錦  發布時間:2007-07-05 11:01:23

1、如何設置AXD連接的Target。

    在菜單的Configure Target…選項中可以設置。一般選擇MutiIce或者ARMUL兩種。

    ARMUL是一種ARM的模擬器。一般的算法或者一些無需和硬件中斷等設備打交道的程序都可以通過這個進行調試。使用上非常簡單。

    我們一般上板子進行調試都是通過MutiICE來進行。在剛剛安裝了系統的時候,菜單中沒有MutiICE,需要我們手動添加:

    點擊ADD按鈕,然后在彈出的文件瀏覽中,選擇“C:\Program Files\ARM\Multi-ICE\Muti-ICE.dll”(默認安裝的話)。然后點擊“確定”。這樣就把MutiICE的調試接口安裝上了。

 

2、如何保存當前的調試現場。

    我們在調試過程中,經常需要在不同的地方設置斷點、設置Watchpoint或者打開很多source文件。但是,一旦我們關閉了AXD,所有的工 作都白費了。

    當我們再次打開AXD后,我們得到的仍然是沒有任何斷點、只打開一個entry文件的調試環境。這里介紹一種方法可以自動保存上一次的調試現 場(寄存器的數據都是保存的)。

    Options->General tab. 這里確認Save and load default sessions 選項 是選中的。然后打開Session File,確保Rselect Target和Reload images 選項是選中的。

    在設置保存后,我們在關閉AXD后,再次啟動,就會自動加載上次的image,恢復寄存器了。

    如果需要保存多個現場,那么就在設置保存后,在File菜單中選擇Save Session來進行保存。

    不過注意,保存的路徑中不能 有空格和特殊字符。最好保存在ClearCase上。

    在需要恢復現場的時候,只需要Load Session就一切OK。你以前辛辛苦苦設置的斷點、 Watchpoint全都回來了。

 

3、不能設置斷點,怎么辦?

    不能設置斷點時,我僅知有幾種解決方案,這里列舉一下:

    A:清空CPU的Vector Catch 。

           在Options->Configure Process..中清除。

    B:Run一下,馬上暫停。

           這種方式對要求不高的斷點(諸如設置在APP層中的斷點)比較合適。方便。

    C:清除以前的斷點。

           一般發生在Flash調試的情況。首先清除以前的斷點,然后才能設置新的斷點。

    D:命令行 spp vector_catch 0

           其實和A相同。如果寫在開機script中,那么就可以自動排除開機無法設置斷點問題。

    E:啟動AXD的時候使用—debug這個參數,這樣就可以添加一個自動斷點在Main()上。 

 

 

4、如何不reload image就可以重新從頭開始調試。

    很多時候我們需要讓代碼重頭跑起來復現一個bug。但是,一般來說,都是reload一下。如果image比較小還可以忍受,但是想660那種16M左右的巨型image,這種代價就未免太大。這里介紹幾種我所知道的方法,可以從頭開始調試:

    A:設置Current寄存器。

       點擊 打開process register->current 組。設置pc為0 , cpsr為 svc模式下。關閉Thumb模式。這時F5即可運行下去。

    B:運行腳本

       這種方式速度更快,也方便。上上之選。

    setpc 0

    sreg cpsr 0xd3

 

5、如何無條件跳轉?

    一般這種事情最好是在同一個函數中,某條語句無條件跳到另一條語句上時使用。最好不要跨函數使用(否則有堆棧錯誤,很難查的)

    把光標定在需要跳轉到的代碼上,右鍵菜單execute->Set Next Statement .

 

6、AXD有沒有什么輔助工具?

    有的。IDA pro ,非常好的axf解析工具。可以統計axf文件中的函數、全局變量、調用關系等。

    界面非常友好,代碼界面可以清楚看出函數引用關系、變量初始話、變量引用、修改的統計。

    可以說,IDA Pro是匯編級的Source insight 。大家可以在網絡上下載它的最新版安裝使用。

 

7、如何調試需要加載到Flash上的代碼

    以下是我的經驗:

    1、在有jTag調試口的板子上Download一個版本。

    2、選擇 File->load debug symbols 。然后選擇CodeWarrior上Release版生成的那個AXF。

    3、現在就可以調試Flash上的程序了。和Debug完全一樣。不過注意,在這種情況下,一般只能設置2個斷點。

 

8、使用fromelf命令

    fromelf命令可以對我們生成的axf文件進行進一步操作的命令。

    諸如:

       從axf文件中抽出二進制代碼:fromelf –bin –output a.bin a.axf

       從axf文件中抽出二進制代碼:fromelf –m32 –output a.s32 a.axf

 

9、 FAQ

    Q: 生成的ram方式的redboot映像文件,應該使用什么工具調試編譯的ram方式的redboot。

       用ADS調試工具只能加載.axf格式的文件

 

 

 

A:   用ADS還可以加載bin文件(File->Load Memory From Memory...),可以使用ADS命令行或腳本初始化SDRAM

 

 

 

load bin文件時需要指定載入地址,對於s3c44b0x通常為0x0c040000,即在相應的ldi文件中指定的

SECTION_rom_vectors (ram, 0x0c040000, LMA_EQ_VMA)

 

 

 

將BIN程序Load后,將PC指針修改為0X0C040000即可

 

8、天嵌公司的ADS常見錯誤文檔

1.     遇到動不動就有*.o文件找不到的情況,而且通常都是開始的時候可以正常LINK,而經過若干次重新LINK后卻找不到(即使只是在代碼中加一個無關緊要得空格),新建個工程,將目前的.C和.H文件原封不動加進去,再LINK就沒有出現這種情況,所以估計可能ADS本身LINK的問題不知道你所說的是不是也是這樣的問題。2.     AXD出現.ses找不到錯誤:工程目錄不可以是中文,修改為英文,重新編譯,若還不行,AXD-options-configure target-雙擊ARMUL-OK-OK,file-load image-找到相應.axf文件。即可。此法每次重復。根治:通過比較c:\documents and settings\****\default-1-2-0-0.ses調試前后的變化,發現問題就出在這里,該文件是一個初始配置文件,調試目標文件之后,該文件就帶上了調試目標文件的路徑等多余信息,所以,AXD無法識別,自然就出現了'c:\documents and settings\****\default-1-2-0-0.ses' could not be loaded的提示。我們只要在配置完成之后,把該文件的屬性該為 只讀,那么就不會在調試的過程中被修改了,以后也就不會出錯了。注意文件的引導路徑(找准Startup.s的路徑),default-1-2-0-0.ses反復刪幾次細心比較下就明白了。

3.    ADS1.2在LINK時找不到Os_cpu_a.o:復制工程到硬盤后,必須去除工程所有文件夾及文件的只讀屬性.如果項目移動到另外一個文件夾后,在重新編譯之前,要選擇菜單project --> remove object code ... ,在彈出的對話框中按"ALL Tagerts"來刪除原來編譯生成的*.o文件,才能編譯成功.

ADS1.2編譯時,出現找不到一個不存在目錄下的目標文件(*.o)

編譯一個COPY到硬盤上的一個工程,出現以下的fatal error message:
Error: (Fatal)L6002: Could not open file f:\工作備份\20061204\hc_DTMF3\DVS-ATM_data\RelInFLASH\ObjectCode\Startuo.o.

        “f:\工作備份”這個目錄我根本沒有,“hc_DTMF3\DVS-ATM_data”這個目錄是源代碼的目錄,但是我是解壓到桌面上的,為什么為出現什么“f:\工作備份”呢,還通不過編譯?

           分析原因:以前在其他計算機上編譯時造成的。         

           解決措施:復制ADS工程到硬盤后,必須去除工程所有文件夾及文件的只讀屬性.如果項目移動到另外一個文件夾后,在重新編譯之前,要選擇菜單project --> remove object code ... ,在彈出的對話框中按"ALL Tagerts"來刪除原來編譯生成的*.o文件,才能編譯成功.

1  Patttern *(RW) only matches removed unused sections.

出現這個這個警告的情況我遇到過兩種,一種是定義的全局變量在引用時拼寫發生了錯誤,改過來就解決了。另外一種情況沒有知道程序發生了什么錯誤,這個時候可以在Edit/DebugIn××× Settings..., ARM linker Options下的Remove unused section下的幾個段中取消remove就可以了,當前這個警告是說RW,所以把Read Write的勾去掉就可以,其他兩種情況同理了。:)

2 有時候會出現打不開某個文件的情況

Project/Remove Object Code ,如果還不行,退出,工程不要放在中文目錄下,換一個目錄,再Project/Remove Object Code ,問題就OK了。

 3 程序執行時發生取數據終止

在uCos_II環境下,運行zlg的gui,發生取數據終止,后來發現是gui任務的堆棧太小,原來64,改為1024,問題解決

4:剛學習使用ADS軟件,在CODE WARRIOR FOR ARM使用的過程中,發現有些*.MCP文件無法通過雙擊打開。原來是該軟件對中文路徑不太支持,但是我們還是可以通過拖拽,和通過CODE WARRIOR FOR ARM的菜單 FILE--OPEN--這兩種方式打開。

5. 果你在WIN7 X64下安裝ADS就會有,

Warning : L6301W:Could not find file C:\Program Files .

Error : L6218 : Undefined symbol .......

好像庫都找不到了。

問題就出在Program Files (x86)那個括號上。ADS是1997年的產品,對本地化支持不好。

這種情況只會出現在WIN7 X64的系統下,x32下沒有Program Files (x86)的目錄,不會有這樣的問題。

所以ADS的所有訪問的路徑,不能有文中或特殊符號。

解決方法:你把ADS安裝在C根目錄下就可以。比如:C:\ARM\ADSv1_2。

還有運行ADS時需要以管理員身份啟動。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM