基于Cortex-M的MCU被廣泛應(yīng)用于各種嵌入式系統(tǒng)中,Cortex-M有很多優(yōu)點(diǎn),比如高性能、低功耗、高代碼密度、豐富的調(diào)試功能、強(qiáng)大的生態(tài)系統(tǒng)等。在錯(cuò)誤異常處理上,Cortex-M提供了強(qiáng)大的錯(cuò)誤異常機(jī)制,幫助提升系統(tǒng)的穩(wěn)健性。
本文主要介紹如何在IAR Embedded Workbench for Arm中調(diào)試Cortex-M HardFault,幫助開(kāi)發(fā)人員在開(kāi)發(fā)過(guò)程中盡早發(fā)現(xiàn)代碼中的錯(cuò)誤異常、提升開(kāi)發(fā)和調(diào)試效率、提高代碼質(zhì)量。
關(guān)于 Cortex-M Fault
Cortex-M包含了如下幾種Fault:
HardFault: 在異常處理中發(fā)生錯(cuò)誤導(dǎo)致的Fault,或者是不能被其它異常處理的Fault。
MemManage Fault: 違反內(nèi)存訪問(wèn)規(guī)則導(dǎo)致的Fault。
BusFault: 內(nèi)存訪問(wèn)過(guò)程中總線出錯(cuò)導(dǎo)致的Fault。
UsageFault: 指令執(zhí)行時(shí)出錯(cuò)導(dǎo)致的Fault,包括:
- 未定義的指令
- 非法未對(duì)齊訪問(wèn)
- 指令執(zhí)行時(shí)非法狀態(tài)
- 異常返回錯(cuò)誤 下面兩個(gè)需要額外使能: - 未對(duì)齊訪問(wèn)字和半字內(nèi)存
- 除零操作
其中,HardFault是永遠(yuǎn)使能的,而MemManage Fault,BusFault和UsageFault默認(rèn)是沒(méi)有使能的,對(duì)應(yīng)的Fault發(fā)生之后會(huì)升級(jí)為HardFault。
在IAR Embedded Workbench for Arm中
調(diào)試Cortex-M HardFault
下面通過(guò)幾個(gè)示例介紹如何在IAR Embedded Workbench for Arm中調(diào)試Cortex-M HardFault。
示例1除零操作導(dǎo)致UsageFault
這個(gè)例子中,通過(guò)配置CCR寄存器中的DIV_0_TRP來(lái)使能除零操作異常。在Call Stack窗口中,可以看到對(duì)應(yīng)發(fā)生除零操作的源代碼行。在Register窗口中,可以看到 CFSR 寄存器中的DIVBYZERO 置位,表示出現(xiàn)了除零操作異常。在Debug Log和Fault exception viewer窗口中,可以看到詳細(xì)的錯(cuò)誤信息:發(fā)生了除零操作異常,導(dǎo)致UsageFault,由于UsageFault沒(méi)有使能,升級(jí)為HardFault,同時(shí)給出了除零操作異常發(fā)生的PC地址和LR地址。
示例2訪問(wèn)無(wú)效地址導(dǎo)致BusFault
這個(gè)例子中,地址0x7000000是MCU中的無(wú)效地址,當(dāng)訪問(wèn)無(wú)效地址時(shí),會(huì)產(chǎn)生BusFault。在Call Stack窗口中,可以看到訪問(wèn)無(wú)效地址的源代碼行。在Register窗口中,可以看到CFSR 寄存器的的PRECISERR和BFARVALID置位,表示出現(xiàn)了Precise data bus error,同時(shí)BFAR中保存了對(duì)應(yīng)訪問(wèn)的無(wú)效地址。在Debug Log和Fault exception viewer窗口中,可以看到詳細(xì)的錯(cuò)誤信息:發(fā)生了precise data access error,導(dǎo)致BusFault,由于BusFault沒(méi)有使能,升級(jí)為HardFault,同時(shí)給出了precise data access error發(fā)生時(shí)的PC地址和LR地址及對(duì)應(yīng)訪問(wèn)的無(wú)效地址。
示例3從XN(Execute Never)內(nèi)存運(yùn)行程序?qū)е翸emManage Fault
在這個(gè)例子中,地址0x4000000在Cortex-M中是屬Peripheral地址空間,對(duì)應(yīng)的內(nèi)存屬性屬于XN(Execute Never):即如果從XN內(nèi)存運(yùn)行程序會(huì)造成MemManage Fault。在Call Stack窗口中,可以看到對(duì)應(yīng)的源代碼行。在Register窗口中,可以看到CFSR 寄存器的的IACCVIOL置位,表示發(fā)生了instruction access violation。在Debug Log和Fault exception viewer窗口中,可以看到詳細(xì)的錯(cuò)誤信息:XN訪問(wèn)違反導(dǎo)致MemManage Fault,由于MemManage Fault沒(méi)有使能,升級(jí)為HardFault,同時(shí)給出了XN訪問(wèn)發(fā)生時(shí)的PC地址和LR地址, 通過(guò)LR地址可以找到之前函數(shù)調(diào)用的地方(即導(dǎo)致MemManage Fault的地方)。
注意事項(xiàng)
1. 為了在調(diào)試時(shí)出現(xiàn)Fault之后程序能夠立即停下來(lái),從而可以更好地分析出現(xiàn)Fault之后的現(xiàn)場(chǎng),需要使能對(duì)應(yīng)的Vector catch選項(xiàng)(默認(rèn)是使能的):關(guān)于Vector catch的更多信息,請(qǐng)參考ARMv7-M Architecture Reference Manual。
2. 本文中的示例是基于Cortex-M4,其它Cortex-M的錯(cuò)誤異常機(jī)制可能會(huì)有所不同(比如基于ARMv6-M的Cortex-M0/M0+/M1只有HardFault,沒(méi)有MemManage Fault,BusFault和UsageFault),對(duì)應(yīng)Register窗口中的信息可能與上面的截圖不同,具體取決于所使用的 Cortex-M 類型。但是本文的方法適用于所有Cortex-M的HardFault調(diào)試。
總結(jié)
本文以Cortex-M4為例,介紹了如何在IAR Embedded Workbench for Arm中調(diào)試Cortex-M HardFault。通過(guò)分析Call Stack,Register,Debug Log和Fault exception viewer窗口中的信息,可以快速地找到HardFault的原因,盡早發(fā)現(xiàn)代碼中的錯(cuò)誤異常,從而提升開(kāi)發(fā)和調(diào)試效率,提高代碼質(zhì)量。
審核編輯 :李倩
-
總線
+關(guān)注
關(guān)注
10文章
2900瀏覽量
88310 -
IAR
+關(guān)注
關(guān)注
5文章
354瀏覽量
36753 -
Cortex-M
+關(guān)注
關(guān)注
2文章
229瀏覽量
29819
原文標(biāo)題:在IAR Embedded Workbench for Arm中調(diào)試Cortex-M HardFault
文章出處:【微信號(hào):IAR愛(ài)亞系統(tǒng),微信公眾號(hào):IAR愛(ài)亞系統(tǒng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論