指令集方面:arm一般高端處理器,比如cortex-a系列,都是32位的arm指令。而cortex-m0,1,3,4等低端處理器,也叫做單片機,為了增加代碼密度(同樣存儲器內(nèi)可以存更多指令),用的是thumb指令集(而且僅支持這個指令集),這個指令集大多數(shù)指令是16位的,少數(shù)是32位的。這就是為什么上面的調(diào)試圖中,看到指令都是兩個字節(jié),而有的是4個字節(jié)。比較老的arm7,arm9等處理器,支持thumb指令和arm指令,需要通過指令告訴處理器,顯式的進行指令轉(zhuǎn)換,這個因此需要編譯器提供支持。
注意:stm32f1(cortex-m3內(nèi)核)單片機,僅支持thumb指令,在blx rx跳轉(zhuǎn)指令執(zhí)行時,會堅持rx寄存器存的地址,的最低為是不是1,如果不是,那么stm32會認為我們企圖切換到arm指令,但是arm指令stm32不支持,因此會跳入hardfault硬件錯誤中斷。stm32進入硬件錯誤中斷時候,會在相應(yīng)的狀態(tài)指示寄存器里置為,用來提醒用戶,是什么問題導(dǎo)致的錯誤。
只有三種錯誤類型,但是都會進入產(chǎn)生硬件錯誤中斷。
HardFault錯誤
這個會在SCB->HFSR寄存器中通過位來標識產(chǎn)生的是什么錯誤,我們可以在進入了硬件錯誤中斷,查看該寄存器的位來知道發(fā)生的是什么錯誤類型。具體哪位是干嘛的,自己查查Cortex-m3與m4權(quán)威指南這本書,講得真心不錯。
1. MemManage錯誤:存儲器管理錯誤
存儲器訪問越權(quán),寫入MPU保護的只讀區(qū)域,壓棧錯誤等等。
會在SCB->CFSR寄存器第一個字節(jié)顯示
2.Bus總線錯誤
比如訪問了非法的存儲器位置等。
會在SCB->CFSR寄存器第二個字節(jié)顯示
3.Usage使用錯誤
比如非對齊訪問,試圖切換到arm指令狀態(tài)等,我上面說的就是這個錯誤。
會在SCB->CFSR寄存器高半字顯示
如果我們在keil mdk中進行調(diào)試,可以在HardFault函數(shù)處打斷點,進入后,菜單欄選擇Peripherals -> Core?Peripherals -> Fault?reportes窗口,看到各個錯誤寄存器的可視化信息顯示,如下圖:我這個錯誤就是由于rx = 20007800, blx rx, 地址rx中的地址最低為不為1,因此出現(xiàn)了使用錯誤,這個位表示我試圖切換到arm指令,因此產(chǎn)生了錯誤。
文章來源:http://www.zghlxwxcb.cn/news/detail-407370.html
?文章來源地址http://www.zghlxwxcb.cn/news/detail-407370.html
到了這里,關(guān)于stm32進入硬件錯誤中斷hardfault的原因剖析以及如何定位(必看)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!