调试笔记--keil 断点调试小技巧
調(diào)試筆記–keil 斷點(diǎn)調(diào)試小技巧
給變量打斷點(diǎn)
調(diào)試不熟悉的項(xiàng)目時,臥槽!怎么這么多全局變量?這玩意又在那修改了??這個時候會給變量打斷點(diǎn)就能省好多事。
Expression: 設(shè)置斷點(diǎn)條件, 表達(dá)式可以使用 == > < ! ,當(dāng)條件為真時, Count 減一
Count:設(shè)置次數(shù),當(dāng) Expression 為真 Count 減一,當(dāng)Count為0時觸發(fā)斷點(diǎn)效果
Access:何時去判斷表達(dá)式 Expression,如果勾選Read,則讀變量時就會去判斷表達(dá)式Expression,同理,勾選Write后,每當(dāng)寫變量時就回去判斷表達(dá)式
Size、Bytes、Objects一般默認(rèn)即可。
設(shè)置完后按Define即可設(shè)置斷點(diǎn)。
4. 刪除斷點(diǎn)
打開debug菜單下的Breakpoints選項(xiàng)
選中要刪除的斷點(diǎn), 點(diǎn)擊Kill Selected
例子
當(dāng)寫入xiaoMing.age變量10次后觸發(fā)斷點(diǎn)
當(dāng)變量 xiaoMing.age 等于 10時,觸發(fā)斷點(diǎn)
注意事項(xiàng)
打斷點(diǎn)其實(shí)就是DEBUG模塊檢測固定RAM地址,當(dāng)有指令用的預(yù)定的RAM地址,將指令進(jìn)行替換,局部變量存放在棧中,地址不固定因此不能這樣操作。全局靜態(tài)變量的作用域只是當(dāng)前文件內(nèi)可訪問,因此如果強(qiáng)行使用可能導(dǎo)致結(jié)果不確定(有可能按照預(yù)期斷點(diǎn)停止,也有可能不會)
既然原理是檢測固定RAM地址,那么直接從Menory找到對應(yīng)地址設(shè)置斷點(diǎn)也是一樣可行的
斷點(diǎn)設(shè)定好后,如下圖,想要修改成只在寫入時檢測,即去掉Read的勾選,需要將改斷點(diǎn)刪除然后重新設(shè)置一個,不能在原來的上面進(jìn)行修改。
斷點(diǎn)分為軟件斷點(diǎn)和硬件斷點(diǎn),硬件斷點(diǎn)數(shù)量由單片機(jī)內(nèi)部硬件決定,實(shí)測M3、M4、M7內(nèi)核是8個硬件斷點(diǎn),軟件斷點(diǎn)是調(diào)試器根據(jù)一定算法,動態(tài)的設(shè)置硬件斷點(diǎn),或者在調(diào)試過程中動態(tài)修改FLASH,達(dá)到斷點(diǎn)數(shù)量無限制效果。
- 手頭有個CMSIS-DAP(第一代DAP)實(shí)測不支持軟件斷點(diǎn),只由硬件按斷點(diǎn),當(dāng)斷點(diǎn)超出后MDK會給出提示
CMSIS-DAP 實(shí)在是需要軟件斷點(diǎn),可以手動在需要加斷點(diǎn)的代碼前加上 __asm(“BKPT 0”); 可以無限個,但是在正式代碼中一定記得剔除
- jlinkV9 支持軟件斷點(diǎn),但是軟件斷點(diǎn)可能會動態(tài)修改flash內(nèi)容(本質(zhì)也是添加 __asm(“BKPT 0”); 語句,只是由jlink自動添加)
MDK5斷點(diǎn)調(diào)試,有時候斷點(diǎn)亂跳,就有可能是用jlink調(diào)試 斷點(diǎn)設(shè)置多了,jlink會修改flash內(nèi)容,這個時候如果直接拔掉jlink,flash中就會保存斷點(diǎn)信息,會影響正常運(yùn)行而且下次調(diào)試時如果沒有更新程序,mdk里面不會顯示該斷點(diǎn),但是斷點(diǎn)信息已經(jīng)在flash中了,執(zhí)行到對應(yīng)語句依然會暫停
缺點(diǎn)
需要實(shí)時監(jiān)聽RAM,所以調(diào)試時運(yùn)行速度慢,不適合和實(shí)時性要求較高的外圍模塊一起聯(lián)調(diào)
總結(jié)
以上是生活随笔為你收集整理的调试笔记--keil 断点调试小技巧的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C# 学习笔记(12)hex文件转bin
- 下一篇: 调试笔记--keil 测量周期小技巧