硬斷點和軟斷點的區別

轉自macrossdzh

硬斷點--break point

軟斷點--assert

 

簡單的解釋:

硬件斷點:硬斷點需要硬件寄存器提供支持,斷點的數目受Embedded ICE中的Watchpoint數目的限制,但是可以在任何地方設置斷點。

軟件斷點:軟件斷點通過在運行起來的程序中設置特徵值實現,其數目不受限制,但是一般情況下軟件斷點只能在可寫的存儲器的地址中設置(比如:RAM),而不能在ROM(比如:Flash)中設置。 

斷點可分爲硬件斷點和軟件斷點兩大類: 
       1.硬件斷點需要目標CPU的硬件支持,當前流行的ARM7/9內部硬件設計提供兩組寄存器用來存貯斷點信息,所以ARM7/9內核最多支持兩個硬件斷點,而ARM11則可以支持到8個硬件斷點.這與調試器無關.
       2.軟件斷點則是通過在代碼中設置特徵值的方式來實現的.當需要在某地址代碼處設置軟件斷點的時候,仿真器會先將此處代碼進行備份保護,然後將預先設定好的斷點特徵值(一般爲0x0000等不易與代碼混淆的值)寫入此地址,覆蓋原來的代碼數據.當程序運行到此特徵值所在的地址時,仿真器識別出此處是一個軟斷點,便會產生中斷.當取消斷點時,之前受保護的代碼信息會被自動恢復.
     硬件斷點可以設置在任何位置的代碼上,包括ROM和RAM;而軟件斷點由於需要修改相應地址的值,所以一般只能設在RAM上,但是數量可以不受限制.由於硬件斷點設置的靈活性,所以是最優先選用的斷點資源,但是兩個斷點往往很難滿足工程師進行深入調試的需要,於是軟件斷點可以作爲硬件斷點的補充資源來使用.
     由於通常的軟件斷點只能設在RAM運行的代碼上,而隨着系統的代碼量越來越大,特別是在移動通信領域,擴充大容量的RAM勢必會增加產品的成本,所以現在很多系統直接在FlashROM上運行代碼.對於這種在FlashROM上運行代碼的系統,一般的軟件斷點是無法設置的,這也是軟件斷點的侷限性.對於這樣的系統,只能通過交替使用兩個硬件斷點滿足需要,但是會帶來一定的不便. 要很好的解決這一矛盾,只有使仿真器增加在FlashROM上設置軟件斷點的功能,拓展仿真器中可供利用的斷點資源. 在FlashROM上設置軟件斷點的原理與在RAM上設置軟斷點類似,也是在設定的斷點處用特徵碼替換原有代碼,通過識別特徵碼使斷點事件發生.不同的是,在FlashROM上設置軟件斷點需要對Flash進行擦寫操作,這就需要仿真器能夠有Flash編程功能,並且能夠在儘可能短的時間內完成特徵碼的寫入.完成這一系列的讀寫操作,就可使在FlashROM上調試代碼的工程師獲得更充裕的斷點資源,從而大大提高了開發效率.
       但是,由於對Flash進行擦寫需要一定的時間,所以在執行到Flash斷點的時候會感覺到有一個停頓的時間.雖然這一點比RAM上的軟件斷點要差些,但是相對於給工程師調試工作整體上帶來的便利而言,這一點是完全可以接受的.
設置斷點進行調試是最基本的一種調試手段,選擇具有豐富斷點資源的ICE仿真器,可以明顯地提高調試效率.當然,前提是工程師能夠靈活使用各種斷點資源.

 

下邊這段話引自《ARM JTAG 調試原理》,可以從具體實現上理解:
     (1)WP Address Value/Mask Register和硬件斷點
     斷點是用來標識某個地址上的指令的,所以要將一個WATCH POINT用作斷點設置,首先需要將WP Control Value寄存器的nPOC位置0,用來表示:只有在當前的週期是進行取指令的條件下,才觸發斷點。要在一個地址設置一個斷點,可以通過WP Address Value/Mask這兩個寄存器來實現。假設,要在地址0x0040設置一個斷點,可以將WP Address Value寄存器的值設置爲0x0040,同時將WP Address Mask寄存器的值設置爲0x0。另外,將WP Data Mask設置爲0xFFFFFFFF,這樣可以屏蔽掉WP Data value寄存器的影響,在進行比較的時候,只考慮地址是否匹配。這樣,每次ARM7TDMI從地址0x0040取指令的話,不管該指令是什麼,斷點就會被觸發,ARM7TDMI會暫停當前的運行,自動進入調試狀態,要清除該斷點的話,只要改變WP Address Value寄存器的值,或者設置WP Control Value寄存器,禁止該功能。如果你想在所有地址的低16位的值爲0x0040的地方設置斷點,可以配合使用WP Address Mask寄存器,  將它的值設置爲0xFFFF,0000,這樣的話,每次比較的時候,高16爲的地址就會被屏蔽掉。其實這種使用方式應該是比較少的,比較多的情況是,屏蔽掉最低2位或者最低1位的地址。在ARM狀態下,因爲ARM指令的長度是32位的,所有指令地址的最低2位必須爲0,所以,如果在ARM狀態下,一般將WP Address Mask的低2位置1,在進行地址比較的時候,屏蔽掉地址低最低2位,確保斷點是被設置在正確的地址上;如果類似,如果是在THUMB狀態下,一般需要將WP Address Mask的最低1位置1。上面描述的是第一種設置斷點的方式,這種方式是通過地址比較來實現斷點的。這也是我們常說的硬件斷點,這類斷點可以被設置在任何地址(包括FLASH和SDRAM)。因爲ARM7TDMI提供了兩組WP Address Value/Mask寄存器,所以,可以支持兩個硬件斷點。下面讓我們來看看斷點的另外一種實現方式。
     (2)WP Data Value/Mask Register和軟件斷點
     在調試過程當中,通過WP Data Value/Mask寄存器也可以實現斷點設置。利用WP Data Value/Mask如何實現斷點設置呢? 和硬件斷點的設置一樣,首先需要將WP Control Value寄存器的nPOC位置0,用來表示:只有在當前的週期是進行取指令的條件下,才觸發斷點。 然後,將WP Address Mask寄存器的值設置爲:0xFFFFFFFF, 這樣可以屏蔽掉WP Address value寄存器的影響,在進行比較的時候,只考慮數據是否匹配。接下來,將WP Data Value寄存器的值設置爲一個固定的值,例如:0xDEDEDEDE,將WP Data Mask寄存器的值設置爲0x00000000。在需要設置斷點的地方,將其內容替換爲0xDEDEDEDE。這樣,一但程序運行到該位置,嘗試從該位置取指令或者數據的時候,因爲取得的數據值和WP Data Value寄存器的值相同,ARM7TDMI會暫停當前的運行,自動進入調試狀態。要清除該位置上的斷點,我們只需要將該位置原來的指令恢復就可以了。這樣,退出調試狀態後,程序可以繼續正常的運行。通過WP Data Value/Mask寄存器,我們可以在任何需要設置斷點的地方,將其內容替換爲一個固定的序列,就可以達到設置斷點的目的。這種斷點就是我們通常所說的軟件斷點。軟件斷點的設置方式使得ARM7TDMI可以支持任意數量的軟件斷點。但也決定了軟件斷點的侷限性:軟件斷點不能設置在ROM/FLASH裏面。因爲軟件斷點的實現需要替換要設置斷點的位置的內容,這點在ROM/FLASH做不到。(雖然從某種意義上來說,FLASH也是可讀寫的,但是需要特殊的指令)。

 

參考:

http://hi.baidu.com/leetonhill/blog/item/84e9cb4635c9f03286947358.html

http://www.cnblogs.com/dongdonghuihui/archive/2010/04/13/1711030.html

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章