Cortex-M核除0操作的报错机制话题

1. 前言

除 0 操作属于错误操作,在 ARM Cortex M 平台上会有相应的报错机制。但这边会涉及到整型数的除 0 以及浮点数的除 0,另外还会涉及错误产生后的报错机制,是中断还是错误位,本文会对这个报错机制加以说明。使用 STM32H723 做为测试芯片。

2. 整形数除 0 操作报错

默认情况下,STM32H723 对整形数的除 0 操作,会忽略掉错误,原因在于默认情况下SCB->CCR 寄存器默认配置中这个除 0 操作是非捕获状态,如果想要系统报错,需要把DIV_0_TRP 这个位置 1,这样,当执行除 0 操作的时候会进入 hardfault,并且有标志位产生。
在这里插入图片描述
在这里插入图片描述
测试执行整型数除 0 操作代码

/* Enable System clock */
__HAL_RCC_SYSCFG_CLK_ENABLE();
/* Enable DIV_0_TRP */
SCB->CCR |= (1<<4);
/* Div value set to 0 */
IDiv = 0;
/* Exctue div 0 */
Iout = Iin/IDiv;

在这里插入图片描述

在这里插入图片描述

3. 浮点数除 0 的报错机制

浮点数的除 0 操作,没有专门的 Hardfault 触发机制,也就不能产生中断,只能通过对 FPU单元的读取进行判别,而且在调试模式下,通过 IAR 读取寄存器的结果是正确的,而通过 Keil 的读取会有错误,实际已经发生了浮点除 0 操作,但 Keil 的 FPU->SCR 寄存器 DZC 没有置位。
在这里插入图片描述

static volatile float fin = 0.9f,fout,fdiv;
static volatile uint16_t Mark;
/* Div value set to 0 */
fdiv = 0.0f;
/* Exctue float div 0 */
fout = fin/fdiv;
/* Get wrong mask value */
Mark = __get_FPSCR();

在这里插入图片描述

读取 FPSCR 寄存器,返回错误码 0x02(除 0 操作)

在这里插入图片描述

4. 结论

本文通过对除 0 操作的报错机制做细致说明,可以看到整型除 0 可以有 Hardfault 的中断产生,而浮点的除 0 只能通过标志位判别,实际使用过程中尽量避免这种错误的操作。


本文档参考ST官方的《ARM Cortex-M平台整型及浮点数除零报错机制详解》文档。
参考下载地址:https://download.csdn.net/download/u014319604/90347177

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值