嵌入式開發,沒有串口如何看日誌?
本文主要探討嵌入式開發中消息日誌輸出的方式,全文1300字,讀完大約需要3分鐘。首發於微信公眾號「洛奇看世界」,歡迎轉載。
最近客戶的一個項目,試產階段發現有部分盒子沒有正常啟動。項目出於第三方的安全要求,板子上沒有串口,準確說是PCB設計階段沒有給串口布線。以前說沒有串口,基本上硬體上都預留了串口位,只是沒有貼上串口座子而已,這種情況下焊上座子就好了~但現在沒有串口,是真沒有。
產品無法正常啟動,但又拿不到列印信息,到底是什麼問題,盲了,所以解決問題基本靠猜。會議上項目,產品,管理,硬體,軟體,技術支持,大家紛紛腦洞大開,頭腦風暴找原因,可能的情形好幾種,但都比較難落實和驗證。
後來我想起了以前實現過在bootloader支持framebuffer的方式,把系統啟動的日誌消息通過HDMI輸出到電視上,最終發現是系統分區數據被破壞,載入前的完整性驗證沒有通過。
關於bootloader支持framebufer請參考我以前的兩篇文章:
1. 博通機頂盒平台framebuffer輸出(一)https://blog.csdn.net/guyongqiangx/article/details/532045122. 博通機頂盒平台framebuffer輸出(二)
https://blog.csdn.net/guyongqiangx/article/details/53204539
另外也可以參考u-boot支持framebuffer的驅動。
通常串口列印輸出是嵌入式開發中最常見最基礎的一種,其實除了串口外,也還有其他可能的辦法,以防在串口不工作時使用,例如上面的framebuffer方式就是其中一種。
以下是一些可能的途徑:
1. 串口
最直接最常見的方式。
串口輸出的最大優點是設備驅動非常簡單,對於有串口模塊(如NS16550)的晶元,通過寄存器設置好串口引腳和波特率就可以使用了。
對於系統複位早期,只需要在彙編或者C代碼中初始化完串口就可以跟蹤了,可以看到較早時期的信息。
2. 內存
還有一種比串口更簡潔的方式是將日誌消息保存到指定的內存區域,然後通過一些外部工具查看或導出內存區域的信息來了解詳細的情況。
3. 文件
系統啟動後,將日誌消息以文件的形式保存到文件系統,通過其他辦法讀取文件來獲取調試信息。例如,將消息日誌保存到U盤上,這樣可以離線在電腦上讀取U盤上保存的信息。
當然,也不一定需要文件系統,例如可以將日誌消息以原始的方式寫到flash上,通過燒錄器或其它方式下載flash上的日誌數據也是可以的。這種方式跟存放到內存有一些相似。
4. 顯示
這裡也就前面我所採用的辦法,沒有串口的情況下,實現顯示驅動,然後將日誌消息發送到framebuffer通過顯示輸出。相對前面的幾種方式,顯示輸出略微複雜,主要是需要有顯示介面,也需要在bootloader實現顯示驅動。
5. 網路轉發
在有網口的情況下,也可以考慮在網路初始化完成後通過網口將日誌消息發送出來。可以參考類似廣播消息的方式,或者類似刷機的fastboot方式那樣,將設備初始化為一個服務端,然後通過客戶端建立連接,實現基於網路的控制台,基於控制台就可以進行各種操作了。
6. 其它方式
實際上基於上面網路轉發的方式,理論上任何數據輸出介面都可以用來傳輸消息。例如,通過I2C匯流排轉串口,通過USB轉串口;又或者使用wifi或藍牙建立連接等等,都可以達到將日誌消息輸出的目的。
以上6中方式中,將日誌輸出到串口或保存到內存最簡單,需要的額外工作最少。串口輸出比較直觀,保存到內存需要有可以查看內存的工具。也可以採用多種方式結合,例如先將日誌保存到內存,等系統外圍設備初始化完成後再將其從內存轉移到U盤或通過外部設備。
除了上面提到的種種方式外,使用JTAG調試是最根本最直接的了,只不過在量產的板子上很多都沒有預留JTAG介面,又或者沒有JTAG調試設備,無法使用這種方式。
- 本文原創發佈於微信公眾號「洛奇看世界」,一個大齡2b碼農看世界。
- 關注微信公眾號「洛奇看世界」
- 回復關鍵詞「Android電子書」,獲取超過150本Android相關的電子書和文檔。電子書包含了Android開發相關的方方面面,好不好,你說了算。
推薦閱讀: