眾所周知,在 C 語(yǔ)言中,當(dāng)一個(gè)數(shù)除以0的時(shí)候,會(huì)導(dǎo)致除法運(yùn)算異常。程序也會(huì)因此崩潰。 為了避免程序崩潰,我們需要在代碼中包含對(duì) 0 的判斷。 但是呢,在 STM32 單片機(jī)上運(yùn)行除零運(yùn)算的C程序代碼時(shí),卻不會(huì)出現(xiàn)程序崩潰的現(xiàn)象。這是怎么回事呢?
今天來(lái)簡(jiǎn)單聊一聊這個(gè)問(wèn)題。
聊一聊
按照常規(guī)的認(rèn)知,如果 C 語(yǔ)言程序代碼中出現(xiàn)除以零的操作時(shí),會(huì)進(jìn)入異常處理,而導(dǎo)致程序出現(xiàn)異常。 有小伙伴遇到過(guò)這種場(chǎng)景,除零操作后續(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ā)生。
通過(guò) 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 則需要通過(guò) SHCSR 寄存器 bit18 進(jìn)行配置。
審核編輯:劉清
-
寄存器
+關(guān)注
關(guān)注
31文章
5250瀏覽量
119192 -
C語(yǔ)言
+關(guān)注
關(guān)注
180文章
7575瀏覽量
134016 -
觸發(fā)器
+關(guān)注
關(guān)注
14文章
1990瀏覽量
60866 -
Cortex-M3
+關(guān)注
關(guān)注
9文章
268瀏覽量
59359 -
STM32單片機(jī)
+關(guān)注
關(guān)注
58文章
549瀏覽量
58465
原文標(biāo)題:STM32單片機(jī)除零運(yùn)算為何程序不崩潰?
文章出處:【微信號(hào):玩點(diǎn)嵌入式,微信公眾號(hào):玩點(diǎn)嵌入式】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論