眾所周知,在 C 語言中,當一個數(shù)除以0的時候,會導致除法運算異常。程序也會因此崩潰。 為了避免程序崩潰,我們需要在代碼中包含對 0 的判斷。 但是呢,在 STM32 單片機上運行除零運算的C程序代碼時,卻不會出現(xiàn)程序崩潰的現(xiàn)象。這是怎么回事呢?
今天來簡單聊一聊這個問題。
聊一聊
按照常規(guī)的認知,如果 C 語言程序代碼中出現(xiàn)除以零的操作時,會進入異常處理,而導致程序出現(xiàn)異常。 有小伙伴遇到過這種場景,除零操作后續(xù)的代碼可以正常執(zhí)行。其單片機為STM32系列單片機。
我們查閱 Cortex-M3 指南,可以看到除以零操作會導致用法異常(Usage Fault)。
從中可以得知,進入Usage Fault 是有前提條件的,即 只有在 DIV_0_TRP 置位時才會發(fā)生。
通過 DIV_0_TRP 配置,打開除零異常中斷捕獲。這個位寄存器在 SCB->CCR 寄存器中。
默認狀態(tài)下,DIV_0_TRP 為 0,除零操作不會產(chǎn)生異常,并且得到的結(jié)果總是為 0;當將 DIV_0_TRP 配置為1時,將會觸發(fā)除零異常中斷。
好了,到此可以解釋為何 STM32 單片機默認情況下,進行除零操作,不會出現(xiàn)程序異常崩潰。
另外,除零異常觸發(fā) UsageFault ,但是默認情況下,UsageFault 處于被禁用狀態(tài)。這時,除零異常會進入 HardFault 異常中斷。
若想使其進入 UsageFault 則需要通過 SHCSR 寄存器 bit18 進行配置。
審核編輯:劉清
-
寄存器
+關(guān)注
關(guān)注
31文章
5372瀏覽量
121293 -
C語言
+關(guān)注
關(guān)注
180文章
7615瀏覽量
137848 -
觸發(fā)器
+關(guān)注
關(guān)注
14文章
2018瀏覽量
61380 -
Cortex-M3
+關(guān)注
關(guān)注
9文章
270瀏覽量
59609 -
STM32單片機
+關(guān)注
關(guān)注
59文章
549瀏覽量
58845
原文標題:STM32單片機除零運算為何程序不崩潰?
文章出處:【微信號:玩點嵌入式,微信公眾號:玩點嵌入式】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論