基于AM335x的U-Boot/SPL 的CCS 調(diào)試
最后點擊Finish,SPL就會被load到片上RAM中了。如果在console窗口中有錯誤信息,需要把SPL image重新加載 一遍。
B. 加載 symbol。
在上一步里,只是加載了RAW image,還沒有加載調(diào)試所需要的帶有調(diào)試信息的symbol。
可以通過Run -》 Load -》 LoadSymbols 加載symbol信息,界面如下:
這里選擇的是帶有symbol信息的U-Boot-spl.
C. 設置Cortex-A8 core到ARM狀態(tài)。
ARM core 啟動后,默認在Thumb(16bit)模式下,如前面所說,需要將其切換到ARM(32bit)下。具體做法是,View-》Registers, 展開CPSR寄存器,把T位設置為0。界面如下:
D. SPL的單步調(diào)試。
a. 從SPL編譯的memory map可知,SPL從0x402f0400開始執(zhí)行,所以首先就要把寄存器PC的值設為0x402f0400??梢酝ㄟ^ View-》Registers中設置PC指針的值即可, 界面如下,將紅色框里面的改為0x402f0400即可。
b. 點擊Debug窗口(view-》debug)上tool bar中的匯編單步按鈕,如下圖所示,就開始調(diào)試了。
這時,在反匯編窗口(view-》disassembly)中,如下圖所示,看到的是匯編代碼,而且在編輯窗口這邊看不到源碼。這是由于開始執(zhí)行的代碼在/arch/arm/cpu/armv7/start.s 中,反匯編和匯編一樣,所以沒有顯示源碼。
同時,可以看到PC指針運行到0x402f0458處。這里只是單步執(zhí)行了一條指令,為什么跳過了這么大塊地址?這里的單步運行,指令地址空間跳轉(zhuǎn)了n指令,而不是一條指令,這是因為0x402f0400處存放的是異常中斷向量表,通過默認啟動的入口跳到reset symbol對應的地址了,也就是在0x402f0400處跳轉(zhuǎn)到0x402f0458了,具體代碼(arch/arm/cpu/armv7 /start.S)如下:
_start: b reset
reset:
bl save_boot_params
接下來,可以在C代碼中設置斷點,進行調(diào)試了。有兩點值得注意:
i. 如果編譯的時候,交叉編譯器的性能優(yōu)化選項是開著的,那么優(yōu)化后編譯生成的代碼,其執(zhí)行循序和C源碼有差別,這時設置斷點時,其實際的位置不會很準。所以,這里可以根據(jù)需要,決定是否關(guān)閉-O2選項。
ii. 在CCS中,把core停下來時,CCS會根據(jù)image中調(diào)試信息所包含的源碼路徑,找到對應的源碼和symbol。由于U-Boot/SPL是在 Linux中編譯,所以其路徑都是Linux下的路徑,所以Linux版本的CCS可以直接找到對應的源碼,而對于Windows版本的CCS不能直接找到,需要通過手動找到源碼,但是找到一個文件的源碼后,CCS會根據(jù)相對路徑找到其他文件。除了這點外,Linux和Windows的CCS配置使用是一樣的。
3.4 U-Boot的調(diào)試
總體來說, U-Boot的調(diào)試過程和SPL調(diào)試過程是類似的,這里主要說明不同的幾點:
A. 從AM335x的啟動過程可知,U-Boot是運行在DDR中的,而DDR是由SPL來初始化的,所以,加載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 的調(diào)試, U-Boot有個地方不同,即有代碼的重載(code relocation), 重載后代碼的在SOC上的memory map和編譯出的memory map會有個偏移。這個過程是在函數(shù)relocate_code()中完成的。 relocate_code()函數(shù)是在board_init_f()中調(diào)用的,如果需要調(diào)試從調(diào)用該函數(shù)開始后面的代碼,則加上偏移重載symbol。
在CCS的菜單, Run-》 Load -》 Add Symbols, 加載的image還是前面的U-Boot, data/code offset 都是0x9FF88000。 這里的offset是從gd-》relocaddr(arch/arm arch/arm/lib/board.c)得到的。設置界面如下:
注意到上述幾點,然后就可以按照SPL的調(diào)試過程對U-Boot進行調(diào)試了。
4. 總結(jié)
關(guān)于用CCS+emulator對AM335x的U-Boot/SPL的調(diào)試就介紹完了。這里介紹的方法,包含了CCS+emulator調(diào)試的基本原則,不僅僅可以運用于U-Boot/SPL調(diào)試,也可以運用于Starterware,Kernel等調(diào)試。
評論