晶元啟動除錯一般方法

2021-09-20 23:29:43 字數 1950 閱讀 5099

在晶元樣片流片回來之後,所有的人最關心的就是新的功能是否正常、舊版本發現的問題是否解決,這就需要把樣片替代驗證系統裡老晶元,重新把系統跑起來進行驗證。在樣片階段,可能由於封裝比較簡陋、成品率很低等方面原因導致出現各種奇怪的問題。 由於晶元的驗證系統涵蓋了晶元驗證板卡、新晶元、啟動韌體(bios)、作業系統等,因此可以按照從硬體到軟體、從最底層到最上層的層次進行逐一排查。

檢查主機板靜態設定

這裡所說的主機板靜態設定是指驗證系統在上電前後一些不再變化的跳線帽、撥碼開關,這些設定通常用來設定系統訪問頻率、取指模式等,具體的說明如下:

是否上電成功:並不是所有的情況下ac cord連線到了驗證板卡上,就能保證系統一定能夠上電。考慮下面的三種情況:ac停電了,電源故障導致無法輸出期望的dc,或者dc處於power off狀態,或者psu韌體問題。這些情況,都需要考慮到。

cpu倍頻係數:cpu倍頻係數,是指cpu實際執行的頻率相對於cpu基準時鐘頻率的倍數。任何晶元都有最高的設計頻率和最低頻率,頻率過高或者過低都會導致cpu取指、執行異常。

記憶體倍頻係數:是指記憶體執行的頻率相對於記憶體基準時鐘頻率的倍數。如果頻率超過設計頻率,就會出現內初始化失敗或者系統跑飛的問題。

匯流排倍頻係數:是指外部匯流排(ht、pcie)匯流排實際執行頻率相對於基準時鐘的倍數。如果設定不對可能出現匯流排初始化失敗的問題。

取指模式:spi/lpc

cpu剛開始執行的時候,最早的一部分指令都是從flash中取指執行的。為了提高取指執行的速度,當前很多cpu最早都是從spi flash中去取指令,但還有早期的部分cpu仍然從lpc flash取指。有的主機板上,這些是通過乙個跳線設定的,所以除錯時候需要主意:如果是從spi/lpc flash中區指,需要保證對應型號的flash晶元放置在正確的flash位置,否則會導致無法取指執行。

bios晶元:

bios晶元可能由於燒寫失敗,或者放置位置錯誤、韌體二進位制錯誤等導致系統上電後無法正常引導。

如果上面的對主機板的靜態檢查沒有問題,但是bios或者系統還是不能正常啟動,那麼還需要進行下面的動態檢查:

檢查主機板動上電狀態:可以通過萬用表測量cpu核心電壓、io電壓等是否在額定範圍之內,如果cpu核心電壓為0,自然會導致系統無法正常取指,這時需要排查ac2dc電源是否正常、主機板有無故障。

檢查取指時序是否正確:

cpu最早階段不管是從lpc flash還是spi flash取指,實際都是按照lpc、spi協議規範約定的時序去執行。為了排除時序的問題,可以通過示波器抓取相應的時鐘訊號、控制訊號分析波形是否符號時序要求。

觀察cpu、記憶體、匯流排基準時鐘的晶振是否起振:

作為基準時鐘的晶振是整個系統的物理心跳。如果晶振和主機板接觸不良或者不在主機板上,或者晶振不能產生額定頻率的方波,都會導致系統啟動異常。

檢查能否取指

如果上述檢查都通過,但還是無法執行,需要檢查驗證板卡上cpu和對應的插槽是否接觸緊密,也需要排除碰到殘次cpu的可能。

一旦前面所有的檢查都沒有問題,理論上cpu應該可以取指執行。為了更好地跟蹤啟動的過程,及時定位並分析啟動失敗的現象和原因,需要讓bios裡盡早初始化好串列埠、七段數碼管或者gpio/led燈等,並且在bios裡每個重要的啟動步驟列印輸出,或者點led燈和往7段數碼管裡顯示約定的輸出。當然,如果系統上有bmc的話,還可以通過bmc來讀取當前的啟動**。

此外,如果系統支援ejtag工具,還可以連線上ejtag線纜工具,跟蹤啟動階段pc執行的軌跡。比如在mips系統上,下面的不同pc**代表著不同的啟動階段:

bfc******x: 剛從flash開始取指uncache執行的階段

9fc******xx:從flash開始取指使能cache執行的階段

8002******x: 從記憶體取指以cache方式執行的pmon階段

802******xx:從記憶體取指cache執行的kernel核心態 階段

總而言之,晶元除錯過程中,需要結合cpu、bios、多種匯流排協議的知識,利用對主機板硬體上電、時序的了解,盡可能充分使用串列埠、萬用表、示波器、ejtag等工具,加快除錯過程。

軟體除錯的一般思路

解決軟體的bug就像警察破案一樣。警察在掌握了案件發生的時間地點和相關人物後進行分析推理,採訪相關人員,排除嫌疑人,最終找到 同樣的,軟體開發人員在接到bug時,也是分析bug發生的背景,然後在運用各種方法來找出問題的原因。並不是所有的bug都能一眼看出問題發生在哪個地方。雖然bug發生的原因千差萬...

程式除錯的一般思路

每個程式設計師的很多時間都在和bug打交道,而debug的過程總不那麼令人高興。本人在除錯過程中總結了幾點除錯程式的一般方法,寫出來和大家分享,能力有限,歡迎各位大神批評指正!1.單步除錯 從問題程式的起點開始,單步執行程式 觀察變數的變化過程,是最基本的程式除錯方法。這種方法適合錯誤定位範圍較小的...

裝置驅動除錯和移植的一般方法(一)

做linux底層軟體工作也有兩年了,算上研究生時期對底層軟體的研究,加起來也快四年了。慢慢地發現有必要總結一些一般性的方法了。因為一般性的方法有巨集觀上的指導意義,以後除錯和移植驅動時,經常性地回味這些一般性的方法可以防止自己犯同樣的錯誤,進而少走彎路,以最高的效率完成工作。當談到底層軟體,我們一般...