如果你在嵌入式系統行業花時間開發一個產品或者一個DIY項目,你就會知道很多時間都花在了調試上。嵌入式開發人員花費多達50%甚至更多的時間調試他們的應用程序代碼并不罕見!有很多策略可以幫助你減少調試時間。讓我們來探索五種策略,你可以用它們來減少你花在調試上的時間。
策略 1 —— 不要從一開始就將bug放在代碼中
如果你不在你的軟件中放入bug,你就不必花時間去移除它們。減少調試時間的第一個方法是不要在代碼中放入bug!
當然,將bug排除在代碼之外是具有挑戰性的。你不能把它們都排除在外,但是你可以盡量減少進入代碼的數量。最小化bug從擁有合理的、可追蹤的需求開始。如果開發人員知道他們正在構建什么以及它應該如何表現,那么創建這些特性就更容易了。
了解你的需求并鎖定它們會有所幫助,但這不是保證。開發人員需要定義良好的流程來防止錯誤。如果一個bug真的出現了,我們希望能盡快捕捉到它們。如果我只是添加了一行代碼,然后發現我破壞了系統,我知道應該查看哪一行代碼。
也許第一個策略可以表述得更清楚:“開發流程和紀律,以避免將錯誤注入代碼”。
策略2 —— 使用測試驅動的開發
測試驅動開發是敏捷運動中產生的一項令人興奮的技術。核心思想是,在嵌入式開發人員編寫任何生產代碼之前,編寫一個測試,使它失敗,然后編寫生產代碼,使它通過。然后這個過程無限重復。
擁有一個我們證明失敗了并且能夠檢測到失敗的測試是一個有效的調試工具。隨著每個測試的創建,我們可以重新運行舊的測試。如果我們的新代碼破壞了某些東西,測試就會失敗,并直接指向我們破壞的東西。在這一點上,我們知道我們剛剛寫了什么代碼破壞了它,我們破壞了什么。顯而易見,在這些情況下,我們應該能夠顯著減少調試時間。事實上,調試大大減少。
測試驅動開發可以應用于嵌入式系統。可以用它來測試從底層硬件中分離出來的應用程序代碼。通過解耦,你可以輕松地注入數據、探測結果,并驗證代碼是否按預期工作。測試驅動開發也可以用于底層驅動和中間件開發。由于編程周期的原因,這要慢得多。然而,這可能是一個很好的方式來建立和證明驅動程序在各種條件下工作。最終結果是我們花在調試上的時間更少了。
策略 3 —— 使用仿真器
仿真器和模擬器在減少調試時間方面非常有用。由于對嵌入式目標進行編程所涉及的編程周期,調試時間通常會增加。仿真器或模擬器可以在主機環境中執行,無需對嵌入式目標進行編程。結果是嵌入式開發人員可以快速迭代、測試和調試他們的代碼。
策略4——跟蹤你的應用程序代碼
跟蹤技術對于理解嵌入式系統的幫助非常大。跟蹤工具,例如 Percepio 的 Tracealyzer,可以幫助你了解代碼時序、CPU 利用率、狀態等等。例如,當系統開始出現異常行為時,開發人員通常會跳入其中并隨機四處尋找問題可能出在哪里。使用跟蹤工具,開發人員可以可視化隨時間推移執行的內容,并查看它們是否達到了諸如優先級反轉、任務匱乏或其他問題之類的瓶頸。
開發人員可以利用許多跟蹤技術,例如Arm Cortex -M處理器上的串行線查看器。在這些跟蹤接口上,開發人員可以發送調試信息,從而最大限度地減少實時交互,并幫助更快地找到問題的根源。
策略5–了解CPU寄存器和指令集
開發人員偶爾會遇到超級bug。突然出現的bug會導致硬故障或其他災難性的行為。該bug可能是由于堆棧溢出或指針不正常,并試圖在不存在的內存區域執行代碼造成的。當這種情況發生時,開發人員通常必須卷起袖子,深入研究微控制器硬件。理解CPU、外設寄存器和指令集對于解決這些棘手的問題至關重要。
結論
開發人員永遠不會實現沒有bug的軟件。我們今天設計和建造的系統太復雜了,但這并不意味著我們沒有可以用來減少調試時間的策略和工具。正如我們在這篇文章中所看到的,我們可以建立適當的程序來防止大多數bug進入軟件。盡管如此,當他們這樣做時,嵌入式開發人員可以使用測試驅動的開發、跟蹤、模擬器和其他技術來幫助我們最大限度地減少調試時間。