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

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

    关注

    453

    文章

    50287

    浏览量

    421259
  • ARM
    ARM
    +关注

    关注

    134

    文章

    9034

    浏览量

    366586
  • 寄存器
    +关注

    关注

    31

    文章

    5304

    浏览量

    119889
  • MDK
    MDK
    +关注

    关注

    4

    文章

    209

    浏览量

    32018

原文标题:基于STM32的除以0运算话题

文章出处:【微信号:stmcu832,微信公众号:茶话MCU】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    技术科普 | 芯片设计中的LEF文件浅析

    技术科普 | 芯片设计中的LEF文件浅析
    的头像 发表于 11-13 01:03 60次阅读
    技术科普 | 芯片设计中的LEF文件<b class='flag-5'>浅析</b>

    STM32到基于Arm的MSPM0的迁移指南

    电子发烧友网站提供《从STM32到基于Arm的MSPM0的迁移指南.pdf》资料免费下载
    发表于 09-07 11:31 0次下载
    从<b class='flag-5'>STM32</b>到基于Arm的MSPM<b class='flag-5'>0</b>的迁移指南

    stm32boot0和boot1对应哪个p引脚

    STM32系列微控制器是一种广泛应用于嵌入式系统领域的32位微控制器。在STM32系列微控制器中,BOOT0和BOOT1是两个重要的引脚,它们用于设置设备的启动模式。 首先,让我们了解STM3
    的头像 发表于 08-22 09:40 2201次阅读

    十进位、除以十二和二进制计数器数据表

    电子发烧友网站提供《十进位、除以十二和二进制计数器数据表.pdf》资料免费下载
    发表于 05-13 11:03 0次下载
    十进位、<b class='flag-5'>除以</b>十二和二进制计数器数据表

    聊聊TIMER事件触发中断的响应话题

    情况是这样的,现在使用STM32G4系列的TIM8,工作在中心对齐计数,PWM单脉冲模式,使用内部系统时钟做时钟源,计数时不做分频,即PSC=0。CH2做PWM输出。
    的头像 发表于 05-06 16:07 841次阅读
    聊聊TIMER事件触发中断的响应<b class='flag-5'>话题</b>

    聊聊一个关于TIMER事件触发中断的响应话题

    情况是这样的,现在使用STM32G4系列的TIM8,工作在中心对齐计数,单脉冲PWM模式,使用内部系统时钟做时钟源,计数时不做分频,即PSC=0。CH1做PWM输出。
    的头像 发表于 04-28 09:44 471次阅读
    聊聊一个关于TIMER事件触发中断的响应<b class='flag-5'>话题</b>

    STM32G474除以0会进错误中断,为什么?

    我的编译环境为STM32CubeIDE,芯片为STM32G474,我发现程序中如果有除以0的操作时,会跑到错误中断中。请问能不能通过设置,可以让程序不要跑进错误中断,直接等于当前变量类
    发表于 04-01 06:32

    STSPIN32F0支持硬件浮点运算吗?

    STSPIN32F0 支不支持硬件浮点运算
    发表于 03-13 06:32

    当算术运算期间发生除以零或下溢/溢出时,ARM926EJ-S内核的行为是什么?

    当算术运算期间发生除以零或下溢/溢出时,ARM926EJ-S 内核的行为是什么。 我知道有些架构已经定义了行为,或者可以将其配置为触发中断以响应其中一个算术异常。 该处理器是否具有在运行时检测其中一种情况的功能?
    发表于 02-22 07:35

    STM32开发中的位运算以及位带操作

    操作。同时,STM32还提供了位带操作,使得对单个位进行操作更加方便。本文将详细介绍STM32开发中的位运算和位带操作。 1. 位运算运算
    的头像 发表于 02-02 14:38 1459次阅读

    在TIM模块 (CMU_CLK0) 中使用Fgtm频率,GTM时钟系统为什么总是将Fgtm除以2?

    或者将 CMU_CLK0_CTRL 中的 CNT 设置为 1,我会得到同样的行为,看起来 GTM 时钟系统总是将 Fgtm 除以 2 你能帮我解决这个问题吗?,这是 Aurix 中的已知错误吗?
    发表于 01-30 07:48

    浅析流行的LLM推理堆栈和设置

    还有一个与批次大小有关的数量,它们在一个有趣的点上相交。这个点不取决于硬件之外的任何因素。举例来说,在 A10G 和 A100 上,硬件可以实现的总浮点运算次数的两倍除以内存带宽为 400。
    发表于 01-29 14:52 334次阅读
    <b class='flag-5'>浅析</b>流行的LLM推理堆栈和设置

    stm32f407浮点运算速度

    支持硬件浮点运算单元(FPU),可以提供快速和高效的浮点运算性能。本文将详细介绍 STM32F407 的浮点运算速度。 浮点运算是很多应用中
    的头像 发表于 01-04 10:58 3226次阅读

    话题通信接口的定义和运行效果

    话题接口的定义与使用 话题通信接口的定义也是类似的,继续从之前的机器视觉案例中来衍生,我们想把服务换成话题,周期发布目标识别的位置,不管有没有人需要。 运行效果 现在我们会运行三个节点: 第一个节点
    的头像 发表于 12-01 15:32 412次阅读
    <b class='flag-5'>话题</b>通信接口的定义和运行效果

    STM32C0开发(2)----开发板介绍

    STM32C011F4P6-TSSOP20评估套件可以使用户能够无缝评估TSSOP20封装中STM32C0S系列微控制器的功能,具备高效的处理能力与稳定的性能表现,能够适应各种物联网场景和应用需求。该套件可通过标准的USB Type-c ®至Micro-B电缆将其插入电脑
    的头像 发表于 12-01 14:48 856次阅读
    <b class='flag-5'>STM32C0</b>开发(2)----开发板介绍