每個開發人員都使用斷點來調試他們的軟件,這是根本。雙擊你想中斷程序執行的代碼行,然后放開它(或者它中斷了?)。相當多的嵌入式開發人員沒有意識到在后臺有不同的斷點機制來提供這個關鍵的功能。在這篇文章中,我們將研究硬件和軟件斷點之間的區別,以及它如何影響我們這些開發者。
使用的第一種斷點類型通常是硬件斷點。每個微控制器都有比較器,它們是調試模塊的一部分。例如,ARM Cortex-M微控制器的調試模塊中可以有2-4個比較器。比較器設置有程序計數器值,當出現匹配時,會引發調試事件,程序暫停。硬件斷點是最快和最常用的斷點。
硬件斷點有問題。一個微控制器通常只有2-4個比較器,這意味著一旦它們用完,就不能再添加斷點了!
軟件斷點通常是臨時替換RAM中的指令的指令,該指令或者是非法指令并導致故障,或者是被設計為導致應用程序中斷。ARM指令集中的BKPT指令就是一個很好的例子。當CPU到達這條指令時,它就停止執行。軟件斷點只能用于駐留在RAM中的應用程序代碼。原因是指令實際上被斷點指令換出。一旦開發人員跨過BKPT,原本應該在該位置執行的代碼就會運行。
嵌入式開發人員可以使用幾乎無限數量的軟件斷點,但主要問題是,它們是為運行在RAM中的代碼而設計的。在ARM Cortex-M等現代微控制器上,代碼很可能是從閃存中執行的。這就引出了第三種斷點類型,即flash斷點。
Flash斷點允許開發人員為從flash運行的應用程序創建無限的斷點。就像常規軟件斷點一樣,flash斷點有能力擁有幾乎無限數量的斷點。他們還可以在微控制器內部和外部閃存上工作!Seggar J-Link就是一個具有這種功能的調試器例子。調試器供應商使用許多方法來創建閃存斷點,最好的方法幾乎與典型的硬件斷點一樣快。
從開發人員的角度來看,使用哪種斷點類型幾乎無關緊要。對于開發人員來說,理解正在使用的斷點類型以及他們的系統能夠支持的硬件斷點的最大數量是很重要的。購買一個高質量的專業調試器總是一個好主意,這樣可以確保有足夠數量的斷點可用,并且對于手頭的應用程序來說足夠快。如果這不是一個選項,仔細選擇微控制器也有助于確保嵌入式開發人員最大限度地增加可用的硬件斷點。