(五)stm32工程代碼HardFault異常查錯(cuò)調(diào)試方法
掃描二維碼
隨時(shí)隨地手機(jī)看文章
一、導(dǎo)致異常的原因很多,例如:直接使用未分配空間的指針、棧溢出等一場非法操作便會使程序進(jìn)入HardFault異常狀態(tài)。下面介紹怎么找出程序中的異常。
接下來在keil_MDK工程中,編譯代碼,并debug,之后全速運(yùn)行,可以看到如下圖所示程序進(jìn)入HardFault異常。
如下所示我們找到SP寄存器,0x200045B8即為棧地址,棧里面的值依次為R0~R3、R12、PC(Return address)、xPSR(CPSR或SPSR)、LR。如圖我們看到劃紅線的地方,注意從右往左看。分別為0x0800427D和0x08004BFA。
在show code at address中輸入0x08004BFA,點(diǎn)擊go to即找到出現(xiàn)異常的代碼段附近下面要執(zhí)行的程序。
我們用同樣的方法在show code at address中輸入0x0800427D,找到如下代碼段
可以發(fā)現(xiàn)異常代碼就在uart_send_noackdata這個(gè)函數(shù)里,這個(gè)函數(shù)里我們定義了一個(gè)指針,沒有給他分配空間便開始使用了。由此我們掌握了第一種查找異常的方法。只要記錄棧里面第21~24以及25到28字節(jié)的內(nèi)容即可方便的找到異常代碼。下面介紹使用.map文件查找異常。.map文件在keil工程里面隨著程序的編譯會自動生成。
、
在.map文件里我們查找0x08004BFA,找到了0x08004bd8指示是uart_send_noackdata函數(shù),到此我們找到了異常代碼所在的位置。
由此我們知道我們只要找到棧里面PC(Return address)、xPSR(CPSR或SPSR)寄存器里的內(nèi)存地址便可以找到異常代碼。
CPSR當(dāng)前程序狀態(tài)寄存器(Current Program State Register)
SPSR保存的程序狀態(tài)寄存器(Saved Program State Register), 有6個(gè),主要是在處理異常的時(shí)候使用.
每一種處理器模式下都有一個(gè)專用的物理寄存器作為備份的程序狀態(tài)寄存器SPSR , 當(dāng)特定的異常發(fā)生時(shí),這個(gè)物理寄存器負(fù)責(zé)保存CPSR當(dāng)前程序狀態(tài)寄存器的內(nèi)容, 當(dāng)異常處理程序返回時(shí),再將內(nèi)容恢復(fù)到當(dāng)前程序狀態(tài)器中,繼續(xù)向下執(zhí)行原來程序.
PC
程序計(jì)數(shù)器,是用來計(jì)數(shù)的,指示指令在存儲器的存放位置,也就是個(gè)地址信息