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

有人使用stm32g4系列芯片开发产品。他发现程序中如果遇到除以0的操作时,会跑进出错异常中断而影响程序运行。他想知道能否通过设置,即使发生除以0操作也不让程序跑进异常中断,并期望此时的除法运行结果【也就是商】直接等于当前变量类型所支持的最大值,比如,若被除数为16位变量,则经过该除以零操作后直接为其赋值为0xffff。【实际应用中客户的需求往往也是五彩斑斓的。^_^】
事实上是否可以如该stm32用户所愿呢?我们不妨一起看看。
首先,这个问题不属于stm32外设相关的,而是内核相关的。客户选用的是cortex m4的内核stm32芯片,那我们就从m4内核手册中寻找相关内容。
我们通过查看arm m4的内核手册,可以看到除以0操作会导致用法异常[usagefault],同时它又说了,该操作和非对齐访问操作是否触发异常是可以配置的。详见下方绿色方框内文字。
那么对该用法异常的监测控制是通过哪个寄存器进行配置的呢?经浏览手册得知它是通过配置控制寄存器[scb-》ccr]进行配置的。
根据上面描述可知,当ccr寄存器的div_0_trp位被配置0时,即使发生除以0操作也不会触发异常,只有当该位被置1前提下,当发生除以0操作时才触发异常事件并产生相应中断。
下面我们具体验证下。我找了块m4内核的stm32芯片的开发板。我们先使用arm mdk来验证。
测试代码很简单,就是下面截图中的几行,简单的闪灯操作,里面夹了一句除法操作。scb-》ccr被赋值0x00000210即置位了div_0_trp,当被赋值0x00000200时对其进行清零。
经过测试,当我们置位上面ccr寄存器的div_0_trp位,在发生除以0操作时就会进入hardfault中断,同时被除数的结果【result】即商变为0.
而当我们对div_0_trp位清零,即scb-》ccr被赋值0x00000200时发生除以0操作不会触发hardfault中断,但被除数除以0后其结果依然保持为0。整个程序运行起来感觉不到任何阻滞。
上面是基于arm mdk环境测试的,我们换为iar ide测试看看。
我们依然先验证ccr寄存器的div_0_trp位被置1的情况。经测试,结果跟arm mdk环境下的测试结果完全一致。
当我们对ccr寄存器的div_0_trp位清零时,测试结果也跟arm mdk环境下的一致。
显然,结合cortex m4内核手册的描述和实际验证,当发生除以0操作时是否触发异常事件是可以配置的,至于发生除以0操作后的商,它始终是0,这个结果其实在上面截图有明确提及,这里再单独截图出来。
不过,这个结果跟开篇客户所期望的不一致,这是由硬件决定的,不同的硬件在这个地方处理不尽相同。其实,其它cortex m内核芯片这个地方约定是一样的。
聊到这里,或许有人发现了一个问题。从手册上看,这个除以0操作触发的应该是用法异常【usagefault】,而我们在实际测试时进入的中断却是hardfault异常,这两个异常并不一样啊?
这是怎么回事呢?在此抛砖引玉吧,有兴趣的话不妨查找相关资料继续寻找相关答案。
【注:上面部分截图来自于cortex-m4的各种手册,有需要可以到arm网站自行搜索下载】


视频数据卡设计方案:120-基于PCIe的视频数据卡
怎样利用好RFID帮助警察
全新配色搭载升降式前置摄像头!vivo S1开启预售,主打性价比
金升阳推出第四代芯片级封装的非隔离电源产品K78系列
华为:P10要推出果木绿,oppo:不,是我的果木绿!
浅析基于STM32的除以0运算话题
iQOO 7性能铁三角全方位升级,跑分高达7X万分
2020年黑客发动攻击窃取数十亿美元加密货币
比特币、股票价格是否有关联性?是,也不是
深度洞察 | 安森美碳化硅产品与实力如何再下一城?
IM5200同步降压控制器概述、特点及应用
中移物联网的“野心”究竟有多大?
泓观科技发布首款异步卷积神经网络芯片
DS33R41多芯片模块BSDL测试
福建铁塔依托海量站址资源搭建了智慧海渔平台和智慧海渔监管系统
TiFlash整体模块分层及DeltaTree 引擎优化方案
配置PROFINET IO设备
区块链公有链系统Algorand介绍
什么是零样本学习?为什么要搞零样本学习?
盘点AI领域的10大丰功伟绩 征服世人不在话下