在STM32单片机上运行除零运算的C程序代码时为何程序不崩溃?

电子说

1.3w人已加入

描述

众所周知,在 C 语言中,当一个数除以0的时候,会导致除法运算异常。程序也会因此崩溃。 为了避免程序崩溃,我们需要在代码中包含对 0 的判断。 但是呢,在 STM32 单片机上运行除零运算的C程序代码时,却不会出现程序崩溃的现象。这是怎么回事呢?

今天来简单聊一聊这个问题。

聊一聊

按照常规的认知,如果 C 语言程序代码中出现除以零的操作时,会进入异常处理,而导致程序出现异常。 有小伙伴遇到过这种场景,除零操作后续的代码可以正常执行。其单片机为STM32系列单片机。

我们查阅 Cortex-M3 指南,可以看到除以零操作会导致用法异常(Usage Fault)。

Cortex-M3

从中可以得知,进入Usage Fault 是有前提条件的,即 只有在 DIV_0_TRP 置位时才会发生。

通过 DIV_0_TRP 配置,打开除零异常中断捕获。这个位寄存器在 SCB->CCR 寄存器中。

Cortex-M3

默认状态下,DIV_0_TRP 为 0,除零操作不会产生异常,并且得到的结果总是为 0;当将 DIV_0_TRP 配置为1时,将会触发除零异常中断。

Cortex-M3

好了,到此可以解释为何 STM32 单片机默认情况下,进行除零操作,不会出现程序异常崩溃。

另外,除零异常触发 UsageFault ,但是默认情况下,UsageFault  处于被禁用状态。这时,除零异常会进入 HardFault 异常中断。

若想使其进入 UsageFault 则需要通过 SHCSR 寄存器 bit18 进行配置。

Cortex-M3






审核编辑:刘清

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分