你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

除以0会进错误中断

[复制链接]
仲裁者 提问时间:2021-11-8 10:27 / 已解决

我的编译环境为STM32CubeIDE,芯片为STM32G474,我发现程序中如果有除以0的操作时,会跑到错误中断中。请问能不能通过设置,可以让程序不要跑进错误中断,直接等于当前变量类型的最大值(例如计算完后赋值的变量是16bit,则直接等于65535)?

实际上我之前在使用TI的DSP芯片时,除以0就是直接等于最大值,而不是进错误中断。

程序中计算难免会出现除数等于0的情况,尤其是在初始化阶段的计算,所以大家请不要问我为什么要除以0,谢谢了

收藏 评论10 发布时间:2021-11-8 10:27

举报

10个回答
yr 最优答案 回答时间:2021-11-8 13:48:20

该芯片默认除0不报错,结果为0。可以使能内核的相关位,如果除0,将进入hardfault。

SCB->CCR |= SCB_CCR_DIV_0_TRP_Msk;

image.png

STMWoodData 回答时间:2021-11-8 11:18:39

没有设置的,这是内核决定的,要想不进错误中断,就在除法前判断一下是否为0。

jieguo = (chushu !=0) ? num/chushu : -1 ;

仲裁者 回答时间:2021-11-8 14:22:20

yr 发表于 2021-11-8 13:48
该芯片默认除0不报错,结果为0。可以使能内核的相关位,如果除0,将进入hardfault。</p>
<p>SCB-&gt;CCR |= SCB_ ...

[md]你好,我看了G4芯片的编程手册,发现SCB的CCR寄存器复位后的默认值应该是0x200,但我用demo板跑的时候(用ST官方例程),在Reset_Handler处打了断点,发现复位后的CCR寄存器却是0x210(即默认是会进硬件中断的),请问这个是怎么回事呢?

yr 回答时间:2021-11-8 15:14:05

仲裁者 发表于 2021-11-8 14:22
你好,我看了G4芯片的编程手册,发现SCB的CCR寄存器复位后的默认值应该是0x200,但我用demo板跑的时 ...

[md]我板子默认是关闭的,用关键字找找哪里有被设置了,如果过了reset-handler,还是打开的吗?

仲裁者 回答时间:2021-11-8 15:44:41

yr 发表于 2021-11-8 15:14
我板子默认是关闭的,用关键字找找哪里有被设置了,如果过了reset-handler,还是打开的吗?
...

刚刚搜了SCB->CCR,确实没有地方置位了bit4,Reset_Handler处已经是1,后续也一直是1,没有地方配置过,神奇。。。

我用的是G474RE的NUCLEO板,例程是ADC_GainCompensation

yr 回答时间:2021-11-8 15:56:06

仲裁者 发表于 2021-11-8 15:44
刚刚搜了SCB-&gt;CCR,确实没有地方置位了bit4,Reset_Handler处已经是1,后续也一直是1,没有地方配置 ...

[md]程序第一句就把它bit4清零,有没有效果

仲裁者 回答时间:2021-11-8 16:30:55

yr 发表于 2021-11-8 15:56
程序第一句就把它bit4清零,有没有效果

可以清零,除以零不会进中断

xmshao 回答时间:2021-11-8 16:51:37

关于除0操作是否会触发异常,这个可以配置的。这里涉及到SCR->CCR寄存器的除0控制位,DIV_0_TRP。

当该控制位配置为0时,即使发生除0操作也不触发异常,但是此时的商固定为0,不会是别的值,这些在内核手册里有明示:

When this bit is set to 0, a divide by zero returns a quotient of 0.

我们在代码里可以通过配置该寄存器进行配置,比如SCB->CCR = 0x00000200和CB->CCR = 0x00000210来关闭或开启除0事件的异常捕捉。

xmshao 回答时间:2021-11-8 16:53:32
关于除0操作是否会触发异常,这个可以配置的。这里涉及到SCR->CCR寄存器的除0控制位,DIV_0_TRP。
当该控制位配置为0时,即使发生除0操作也不触发异常,但是此时的商固定为0,不会是别的值,这些在内核手册里有明示:
When this bit is set to 0, a divide by zero returns a quotient of 0.

我们在代码里可以通过配置该寄存器进行配置,比如SCB->CCR = 0x00000200和CB->CCR = 0x00000210来关闭或开启除0事件的异常捕捉。
moluxiyan 回答时间:2021-11-9 11:39:04

除数除之前判断一下就可以了,否则商也没什么意义。不能依赖于处理器本身的设定,不同处理器的处理也不同,程序移植也会留下隐患。数学上除以0等于什么

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版