眾所周知,在 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 配置,打開(kāi)除零異常中斷捕獲。這個(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文章
5430瀏覽量
123982 -
C語(yǔ)言
+關(guān)注
關(guān)注
180文章
7631瀏覽量
141015 -
觸發(fā)器
+關(guān)注
關(guān)注
14文章
2034瀏覽量
62017 -
Cortex-M3
+關(guān)注
關(guān)注
9文章
276瀏覽量
60208 -
STM32單片機(jī)
+關(guān)注
關(guān)注
59文章
550瀏覽量
59505
原文標(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)先 登錄
公交車自動(dòng)報(bào)站系統(tǒng)程序代碼
基于51單片機(jī)的波形計(jì)數(shù)c程序代碼詳細(xì)資料免費(fèi)下載

使用51單片機(jī)設(shè)計(jì)的C語(yǔ)言音樂(lè)程序代碼資料免費(fèi)下載

基于LabVIEW和單片機(jī)實(shí)現(xiàn)DSP應(yīng)用程序代碼的自舉模塊設(shè)計(jì)

評(píng)論