0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

浅析基于STM32的除以0运算话题

茶话MCU 来源:茶话MCU 作者:Miler 2021-11-26 11:42 次阅读

有人使用STM32G4系列芯片开发产品。他发现程序中如果遇到除以0的操作时,会跑进出错异常中断而影响程序运行。他想知道能否通过设置,即使发生除以0操作也不让程序跑进异常中断,并期望此时的除法运行结果【也就是商】直接等于当前变量类型所支持的最大值,比如,若被除数为16位变量,则经过该除以零操作后直接为其赋值为0xffff。【实际应用中客户的需求往往也是五彩斑斓的。^_^】

事实上是否可以如该STM32用户所愿呢?我们不妨一起看看。

首先,这个问题不属于STM32外设相关的,而是内核相关的。客户选用的是Cortex M4的内核STM32芯片,那我们就从M4内核手册中寻找相关内容。

我们通过查看ARM M4的内核手册,可以看到除以0操作会导致用法异常[UsageFault],同时它又说了,该操作和非对齐访问操作是否触发异常是可以配置的。详见下方绿色方框内文字。

68412096-4ddc-11ec-9eda-dac502259ad0.png

那么对该用法异常的监测控制是通过哪个寄存器进行配置的呢?经浏览手册得知它是通过配置控制寄存器[SCB-》CCR]进行配置的。

68a05afc-4ddc-11ec-9eda-dac502259ad0.png

690568ac-4ddc-11ec-9eda-dac502259ad0.png

根据上面描述可知,当CCR寄存器的DIV_0_TRP位被配置0时,即使发生除以0操作也不会触发异常,只有当该位被置1前提下,当发生除以0操作时才触发异常事件并产生相应中断。

下面我们具体验证下。我找了块M4内核的STM32芯片的开发板。我们先使用ARM MDK来验证。

测试代码很简单,就是下面截图中的几行,简单的闪灯操作,里面夹了一句除法操作。SCB-》CCR被赋值0x00000210即置位了DIV_0_TRP,当被赋值0x00000200时对其进行清零。

6976770e-4ddc-11ec-9eda-dac502259ad0.png

经过测试,当我们置位上面CCR寄存器的DIV_0_TRP位,在发生除以0操作时就会进入HardFault中断,同时被除数的结果【Result】即商变为0.

69e1d44a-4ddc-11ec-9eda-dac502259ad0.png

而当我们对DIV_0_TRP位清零,即SCB-》CCR被赋值0x00000200时发生除以0操作不会触发Hardfault中断,但被除数除以0后其结果依然保持为0。整个程序运行起来感觉不到任何阻滞。

上面是基于ARM MDK环境测试的,我们换为IAR IDE测试看看。

我们依然先验证CCR寄存器的DIV_0_TRP位被置1的情况。经测试,结果跟ARM MDK环境下的测试结果完全一致。

6a73de8a-4ddc-11ec-9eda-dac502259ad0.png

当我们对CCR寄存器的DIV_0_TRP位清零时,测试结果也跟ARM MDK环境下的一致。

显然,结合Cortex M4内核手册的描述和实际验证,当发生除以0操作时是否触发异常事件是可以配置的,至于发生除以0操作后的商,它始终是0,这个结果其实在上面截图有明确提及,这里再单独截图出来。

6adaa07a-4ddc-11ec-9eda-dac502259ad0.png

不过,这个结果跟开篇客户所期望的不一致,这是由硬件决定的,不同的硬件在这个地方处理不尽相同。其实,其它Cortex M内核芯片这个地方约定是一样的。

聊到这里,或许有人发现了一个问题。从手册上看,这个除以0操作触发的应该是用法异常【UsageFault】,而我们在实际测试时进入的中断却是HardFault异常,这两个异常并不一样啊?

6b412dcc-4ddc-11ec-9eda-dac502259ad0.png

这是怎么回事呢?在此抛砖引玉吧,有兴趣的话不妨查找相关资料继续寻找相关答案。

【注:上面部分截图来自于Cortex-M4的各种手册,有需要可以到arm网站自行搜索下载

编辑:jq

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

    关注

    437

    文章

    43846

    浏览量

    403381
  • arm
    arm
    +关注

    关注

    131

    文章

    8025

    浏览量

    358758
  • 寄存器
    +关注

    关注

    30

    文章

    4455

    浏览量

    116120
  • MDK
    MDK
    +关注

    关注

    4

    文章

    201

    浏览量

    31583
收藏 人收藏

    评论

    相关推荐

    警惕1除以0的错误

    除以0都是不可以的,应该报错的,但是现实生活中的计算器许多并不如此认为,不过作为工程师,我还是提醒一下大家,最好修正一下,这个bug还是很容易改的!android自带计算器的计算结果是无穷
    发表于 01-26 22:05

    请问STM32有符号数的右移也和除法运算等效吗?

    STM32F030C6T6芯片完成电机的SVPWM控制。现在发现算法中,运行速度很慢。打算将所有的除法运算改成移位运算。一般的,无符号数的右移几位和除以2的几次幂是等效的。但是,在STM32里面,有符号数的右移也和除法运算等效吗?
    发表于 01-22 08:14

    浅析STM32之printf重定向

    浅析STM32之printf重定向
    发表于 12-02 06:19

    STM32启动模式浅析

    STM32启动模式浅析用户闪存存储器启动模式(Main Flash memory)系统存储器启动模式(system memory)SRAM启动(Embedded Memory)所谓启动,一般来说
    发表于 11-26 18:36 11次下载
    <b>STM32</b>启动模式<b>浅析</b>

    关于STM32浮点运算单元FPU的小话题

    STM32芯片做些DSP处理,在启用FPU单元进行调试、验证过程中可能会遇到些小问题、小困惑,这里通过STM32F4芯片一个具体的应用示例简单分享下,希望顺便能给同仁提供些帮助或...
    发表于 12-04 12:51 8次下载
    关于<b>STM32</b>浮点<b>运算</b>单元FPU的小<b>话题</b>

    基于STM32除以0运算话题

    STM32G4系列芯片开发产品。他发现程序中如果遇到除以0的操作时,会跑进出错异常中断而影响程序运行。他想知道能否通过设置,即使发生除以0操作也不让程序跑进异常中断,并期望此时的除...
    发表于 12-04 14:06 7次下载
    基于<b>STM32</b>的<b>除以</b><b>0</b><b>运算话题</b>

    浅析采用高速运算放大器进行低失真设计

    浅析采用高速运算放大器进行低失真设计
    发表于 02-11 15:28 9次下载

    AN5145_从STM32F0系列迁移到STM32G0系列的应用

    STM32F0系列迁移到STM32G0系列的应用
    发表于 11-21 17:06 5次下载
    AN5145_从<b>STM32F0</b>系列迁移到<b>STM32G0</b>系列的应用

    AN4617_从STM32F0STM32L0的软件移植

    STM32F0STM32L0的软件移植
    发表于 11-21 17:06 4次下载
    AN4617_从<b>STM32F0</b>到<b>STM32L0</b>的软件移植

    UM1779_STM32CubeF0入门之STM32F0系列

    STM32CubeF0入门之STM32F0系列
    发表于 11-22 08:22 3次下载
    UM1779_<b>STM32CubeF0</b>入门之<b>STM32F0</b>系列

    模拟乘、除以及平方运算电路

    除以及平方运算电路
    发表于 04-09 10:28 1304次阅读
    模拟乘、<b>除以</b>及平方<b>运算</b>电路

    STM32F0的BOOT配置及相关话题

    STM32F0系列的启动配置,有人说有点看不太懂,貌似有两套启动方式,又是脚又是选项位的。其实,它跟其它STM32 系列一样也是有三种启动模式,只是配置方式上有其特色。 它有两种配置方式,第一种
    发表于 11-29 20:06 2544次阅读
     <b>STM32F0</b>的BOOT配置及相关<b>话题</b>

    关于STM32除以0运算问题

    STM32G4系列芯片开发产品。他发现程序中如果遇到除以0的操作时,会跑进出错异常中断而影响程序运行。他想知道能否通过设置,即使发生除以0操作也不让程序跑进异常中断,并期望此时的除法运行结果
    的头像 发表于 11-19 10:15 1477次阅读

    使用计算机编程除以0会怎么样

    除以 0 可能很棘手,特别是如果您使用计算机或计算器这样做,如果您的计算机或计算器本质上是机械的,则更是如此。 在除法的情况下,如果你取一个数(被除数)除以一个较小的数(除数),结果(商)是一个较大
    发表于 07-28 09:02 1768次阅读

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

    除以0的时候,会导致除法运算异常。程序也会因此崩溃。 为了避免程序崩溃,我们需要在代码中包含对
    的头像 发表于 09-14 11:11 391次阅读
    在<b>STM32</b>单片机上运行除零<b>运算</b>的C程序代码时为何程序不崩溃?