若是你作嵌入式開發,那你必定得對程序斷點(program breakpoint)和數據斷點(data breakpoint)有所瞭解。程序斷點你可能還據說過,但數據斷點就有可能不是很瞭解了,更有可能不知道如何去用了!如今,就讓咱們去了解全部類型的「斷點」吧!
程序斷點就是指處理器指令斷點,通俗的說就是:當程序運行到某個地方時,咱們但願程序停下來,即程序「斷」了!停下來的目的,就是給咱們檢查當前程序運行的狀態的機會。對於軟件開發人員來講,對於程序斷點一點都不陌生,它是咱們調試程序的必需手段。但對於嵌入式開發,咱們還得對程序斷點進行區分:軟件程序斷點和硬件程序斷點。
爲了說明硬件程序斷點,咱們先要了解軟件程序斷點是如何實現的。你想過了嗎?軟件程序斷點究竟是如何實現的?當你用Visual Studio進行軟件開發時,你能夠設置不少的斷點,對不?咱們知道,若是處理器在運行的過程當中,若是碰到了一條非法的指令,那會出現一個異常中斷,程序也會停了下來。軟件程序斷點就是利用這個特性來實現的,當咱們設置一個斷點時,調試工具就在咱們所想設置的程序位置上放置一條非法的指令,同時保留原來的指令。當程序運行時,一旦運行到了咱們設置了斷點的地方,即如今指令是非法的位置,處理器就會產生一個異常中斷從而停了下來。固然,調試工具會接管這一中斷,並在中斷服務程序中,將保存的原來的指令恢復回去。固然,於此同時也會給程序員調試程序的機會,並由程序員決定何時繼續運行程序。從理論上說,軟件程序斷點能夠設n個,這裏的n趨近於無窮(固然內存不容許?)。
有了軟件程序斷點的概念,那麼就好理解硬件程序斷點了。在介紹硬件程序斷點時,咱們先要問一問,爲何要引入硬件程序斷點。引入一種新的概念,每每意味着老的概念存在必定的侷限性。那軟件程序斷點存在什麼侷限性呢?想一想看,在嵌入式系統中,若是咱們想調試一個boot loader(參見《什麼是boot loader》一文),而此時處理器還在運行位於FLASH中的程序,此時軟件程序斷點這種方法還有效嗎?固然不行,由於FLASH中的內容並不能像內存同樣,被處理器經過一個寫操做直接更改。在FLASH中更改內容(或稱對FLASH進行編程)存在必定的協議,而顯然處理器不會去實現這一協議的,這會嚴重影響處理器的通用性。此外,即便實現了,其效率也不會高。即然這樣,軟件程序斷點不能運用到boot loader的調試中去。解決方法時什麼呢?就是處理器提供必定的寄存器用於存放程序的斷點位置,當咱們經過調試工具設置斷點時,調試程序會將所需中斷的指令地址放入處處理器的程序中斷寄存器中。顯然,處理器的這種寄存器是有限的,所以,咱們不能設置n個。
如今讓咱們說一說數據斷點。試想一想,當咱們在調試程序時,若是發現所定義的一個數據結構中的某一個值老是被意外的更改。根據咱們的經驗,這種意外更改是由於程序中存在bug的緣故。在這種狀況下,咱們很難找出根源在哪兒。若是處理器有一種功能,當某塊內存區或具體的地址被意外更改時,停下來就行了。這就是數據斷點的做用!處理器若是提供這種功能,咱們能更方便的找出出錯的根源。高級的處理器每每提供這種功能!類同的是,處理器的數據斷點也是經過處理器提供相應的設置寄存器來實現的,固然也是有限的!
如今讓咱們看一看,處理器處理硬件程序斷點與數據斷點的區別是什麼。對於硬件程序斷點,咱們知道,處理理器須要從內存中取指,而處理器也有一個程序指針PC(program counter),經過將PC值與咱們所設置的程序斷點位置值相比較,處理器就能夠實現硬件程序斷點了。但數據指令就不同了,處理器必須監聽地址總線,當發現有向關心的地址寫數據時,就中斷程序的運行。
相信讀過這篇文章後,你聽到軟件程序斷點、硬件程序斷點和數據斷點時,必定很坦然了。最後,我想指出的是,若是你正在爲你的嵌入式產品選擇處理器,考慮處理器是否支持數據斷點是頗有必要的!程序員