基于A(yíng)M335x的U-Boot/SPL 的CCS 調試

最后點(diǎn)擊Finish,SPL就會(huì )被load到片上RAM中了。如果在console窗口中有錯誤信息,需要把SPL image重新加載 一遍。
B. 加載 symbol。
在上一步里,只是加載了RAW image,還沒(méi)有加載調試所需要的帶有調試信息的symbol。
可以通過(guò)Run -》 Load -》 LoadSymbols 加載symbol信息,界面如下:

這里選擇的是帶有symbol信息的U-Boot-spl.
C. 設置Cortex-A8 core到ARM狀態(tài)。
ARM core 啟動(dòng)后,默認在Thumb(16bit)模式下,如前面所說(shuō),需要將其切換到ARM(32bit)下。具體做法是,View-》Registers, 展開(kāi)CPSR寄存器,把T位設置為0。界面如下:

D. SPL的單步調試。
a. 從SPL編譯的memory map可知,SPL從0x402f0400開(kāi)始執行,所以首先就要把寄存器PC的值設為0x402f0400??梢酝ㄟ^(guò) View-》Registers中設置PC指針的值即可, 界面如下,將紅色框里面的改為0x402f0400即可。

b. 點(diǎn)擊Debug窗口(view-》debug)上tool bar中的匯編單步按鈕,如下圖所示,就開(kāi)始調試了。

這時(shí),在反匯編窗口(view-》disassembly)中,如下圖所示,看到的是匯編代碼,而且在編輯窗口這邊看不到源碼。這是由于開(kāi)始執行的代碼在/arch/arm/cpu/armv7/start.s 中,反匯編和匯編一樣,所以沒(méi)有顯示源碼。

同時(shí),可以看到PC指針運行到0x402f0458處。這里只是單步執行了一條指令,為什么跳過(guò)了這么大塊地址?這里的單步運行,指令地址空間跳轉了n指令,而不是一條指令,這是因為0x402f0400處存放的是異常中斷向量表,通過(guò)默認啟動(dòng)的入口跳到reset symbol對應的地址了,也就是在0x402f0400處跳轉到0x402f0458了,具體代碼(arch/arm/cpu/armv7 /start.S)如下:
_start: b reset
reset:
bl save_boot_params
接下來(lái),可以在C代碼中設置斷點(diǎn),進(jìn)行調試了。有兩點(diǎn)值得注意:
i. 如果編譯的時(shí)候,交叉編譯器的性能優(yōu)化選項是開(kāi)著(zhù)的,那么優(yōu)化后編譯生成的代碼,其執行循序和C源碼有差別,這時(shí)設置斷點(diǎn)時(shí),其實(shí)際的位置不會(huì )很準。所以,這里可以根據需要,決定是否關(guān)閉-O2選項。
ii. 在CCS中,把core停下來(lái)時(shí),CCS會(huì )根據image中調試信息所包含的源碼路徑,找到對應的源碼和symbol。由于U-Boot/SPL是在 Linux中編譯,所以其路徑都是Linux下的路徑,所以L(fǎng)inux版本的CCS可以直接找到對應的源碼,而對于Windows版本的CCS不能直接找到,需要通過(guò)手動(dòng)找到源碼,但是找到一個(gè)文件的源碼后,CCS會(huì )根據相對路徑找到其他文件。除了這點(diǎn)外,Linux和Windows的CCS配置使用是一樣的。
3.4 U-Boot的調試
總體來(lái)說(shuō), U-Boot的調試過(guò)程和SPL調試過(guò)程是類(lèi)似的,這里主要說(shuō)明不同的幾點(diǎn):
A. 從AM335x的啟動(dòng)過(guò)程可知,U-Boot是運行在DDR中的,而DDR是由SPL來(lái)初始化的,所以,加載U-Boot前,先加載并運行SPL。
B. 加載U-Boot 的image是 U-Boot。 這里U-Boot 是ELF格式的, 其包含了加載地址, symbol等信息,所以使用CCS 菜單 Run-》 Load-》 LoadProgram, 加載U-Boot 即可。加載成功后, 如下圖所示:

如圖所示, PC直接指到0x80100000地址了,也就是U-Boot的起始地址(入口)了,該地址是CCS從頭ELF頭里面得到的,其定義在CONFIG_SYS_TEXT_BASE(include/configs/am335x_evm.h)中。
C. 相對 SPL 的調試, U-Boot有個(gè)地方不同,即有代碼的重載(code relocation), 重載后代碼的在SOC上的memory map和編譯出的memory map會(huì )有個(gè)偏移。這個(gè)過(guò)程是在函數relocate_code()中完成的。 relocate_code()函數是在board_init_f()中調用的,如果需要調試從調用該函數開(kāi)始后面的代碼,則加上偏移重載symbol。
在CCS的菜單, Run-》 Load -》 Add Symbols, 加載的image還是前面的U-Boot, data/code offset 都是0x9FF88000。 這里的offset是從gd-》relocaddr(arch/arm arch/arm/lib/board.c)得到的。設置界面如下:

注意到上述幾點(diǎn),然后就可以按照SPL的調試過(guò)程對U-Boot進(jìn)行調試了。
4. 總結
關(guān)于用CCS+emulator對AM335x的U-Boot/SPL的調試就介紹完了。這里介紹的方法,包含了CCS+emulator調試的基本原則,不僅僅可以運用于U-Boot/SPL調試,也可以運用于Starterware,Kernel等調試。
評論