如下是從安富利工程師的技術支持的郵件中摘抄的,在此再次對他們表示感謝。工具
在咱們面對客戶單板的時候,fsbl階段的調試多少會有些問題,在這個過程當中怎麼快速定位客戶的問題,並將有效的信息反饋給但願能幫助到你的人是決定解決問題時間長短的一個重要因素,在這裏我寫下一些我我的的調試經驗,但願對大家有幫助,即便你不打算親自去用這裏面寫的東西,也請將你轉發給你的客戶。我不但願聽到看到收到關於問題的描述是隻是僅僅是一句:客戶的單板上電後沒有任何反應。在這種狀況下你要像瞭解女\男友同樣去了解咱們的芯片,咱們的代碼、咱們的工具。若是你不能理解我這篇文章,那隻能接受馬伊琍式的悲劇,等待第三方的出現。spa
首先在咱們的fsbl工程中是有調試開關的,在src/fsbl_debug.h中增長FSBL_DEBUG_INFO的宏定義,這樣就將fsbl中全部的調試信息打開,啓動過程當中會有各類打印信息。debug
若是很不幸你的fsbl工程已經將這個調試宏配置了,系統啓動後仍是沒有任何打印,在進一步調試以前你先要肯定如下幾個事情:設計
1:BOOT.BIN是否正確燒入flash中或保存在SD卡中3d
2:XPS硬件工程中的串口是否和硬件實際設計一致指針
3:波特率的設置有沒有問題、串口線是否正常調試
當你經過一系列的交叉實驗確認上述一切正常,那隻能往更低層進行分析了,由於這個時候有多是在芯片的BootROM運行階段就出錯了。將你的JTAG線連上單板,確認它正常工做後,咱們能夠繼續。blog
首先我會在xmd裏面經過connect arm hw命令鏈接到芯片,若是一切正常,你會看到下面的信息:flash
OK,這個時候已經鏈接到芯片上了,接下來應該幹什麼?要知道該作什麼跟咱們想知道什麼是息息相關的,這個時候咱們最想知道的是處理器到底運行得怎樣的,處理器運行的怎麼樣經過什麼東西能體現的最直接?固然是CPU的那些通用寄存器,那怎麼查看這些通用寄存器?固然是用rrd的命令:配置
經過rrd,你能夠看到當前的PC指針指向的位置,爲何是0xfffffe1c這個位置?不爲何,由於我尚未將fsbl經過JTAG下載。那咱們繼續吧,經過dow命令來下載fsbl的elf文件。
經過dow加載fsbl成功後,你能夠再經過rrd命令看如今CPU的寄存器的值:
你能夠看到pc已經被設置到0地址了,隨時準備運行,只等你的發令槍響起來,OK,那咱們繼續,執行run命令:
OK,你的fsbl已經跑起來了,這個時候你的問題發生了,只要不發生人力不可抗的事故,基本上你仍是能夠經過stop命令將運行的CPU打住的:
你看到沒有,CPU穩穩的停在了0x0000cd30的位置。固然我這裏是正常狀況,也許你那邊根本就不是這個地方,可是隻要是在dow命令那張圖中的其中一個段中的地址,你仍是有機會查看到CPU運行到什麼位置的。好比我這裏0x0000cd30會對應fsbl工程裏面哪行代碼呢?讓咱們回到SDK中fsbl的工程目錄,找到Binaries裏面對應的elf文件,猛烈雙擊它,在右邊的窗口你就能夠看到反彙編的結果:
咱們在打開的反彙編結果裏面查找cd30,這樣很快就能夠找到對應的C代碼行了:
固然像上面這些正常狀況下的調試都很順利,也許你面對的狀況是將BOOT.BIN文件燒入到外部存儲器以後,系統上電什麼反應都沒有,即便你的fsbl裏面也加了打印。這個時候咱們就要關注一下如下問題:
fsbl是否被BootROM正常加載到OCM裏面了,若是正常加載到了OCM裏面,那就是fsbl執行階段的問題,若是沒有正常加載到OCM裏面,那就是BootROM執行階段的問題。
OK,咱們先看看怎麼判斷fsbl是否被BootROM正確加載到OCM裏面去了沒?
很簡單,若是fsbl正常加載了,那OCM裏面的數據不會是空的,它裏面會是BootROM讀取進來的代碼和數據,就像下面這樣:
若是沒有被BootROM正常加載,那上面的數據就是全0.
OK,接下來分析一下若是沒有被BootROM加載到OCM裏面的狀況,此時通常都是BootROM訪問外設出了問題。再OK一下,咱們須要有個方法來確認是什麼問題。在咱們的芯片裏面有一段slcr寄存器,這裏面有個記錄復位緣由的寄存器REBOOT_STATUS,別被這個名字忽悠到,這裏面確實有跟復位相關的信息,但更重要的是咱們能夠從它的低16位獲取到本次啓動失敗的緣由:
經過mrd命令將該寄存器的值讀出來:
是個2是否是,2就對了,由於在UG585裏面的的Debug Status章節裏面的BootROM Error Output Codes裏面寫着2就是成功的。不2就有問題,你只須要根據這裏面值就能夠大體判斷出問題所在。
若是你看到了這裏說明你是位好同志,請給我發郵件,我會建議領導給你加薪。