前言
除 0 操作屬于錯誤操作,在 ARM Cortex M 平臺上會有相應(yīng)的報錯機制。但這邊會涉及到整型數(shù)的除 0 以及浮點數(shù)的除 0,另外還會涉及錯誤產(chǎn)生后的報錯機制,是中斷還是錯誤位,本文會對這個報錯機制加以說明。使用 STM32H723 做為測試芯片。
整形數(shù)除 0 操作報錯
默認情況下,STM32H723 對整形數(shù)的除 0 操作,會忽略掉錯誤,原因在于默認情況下SCB->CCR 寄存器默認配置中這個除 0 操作是非捕獲狀態(tài),如果想要系統(tǒng)報錯,需要把DIV_0_TRP 這個位置 1,這樣,當執(zhí)行除 0 操作的時候會進入 hardfault,并且有標志位產(chǎn)生。
浮點數(shù)除 0 的報錯機制
浮點數(shù)的除 0 操作,沒有專門的 Hardfault 觸發(fā)機制,也就不能產(chǎn)生中斷,只能通過對 FPU單元的讀取進行判別,而且在調(diào)試模式下,通過 IAR 讀取寄存器的結(jié)果是正確的,而通過 Keil 的讀取會有錯誤,實際已經(jīng)發(fā)生了浮點除 0 操作,但 Keil 的 FPU->SCR 寄存器 DZC 沒有置位
結(jié)論
本文通過對除 0 操作的報錯機制做細致說明,可以看到整型除 0 可以有 Hardfault 的中斷產(chǎn)生,而浮點的除 0 只能通過標志位判別,實際使用過程中盡量避免這種錯誤的操作。