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