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