[开发工具] 实战经验 | Cortex-M核除0操作的报错机制话题

[复制链接]
1051|1
 楼主| STM新闻官 发表于 2025-1-24 13:54 | 显示全部楼层 |阅读模式
本帖最后由 STM新闻官 于 2025-1-24 14:15 编辑

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

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

▲ 图1. SCB CCR默认地址和复位初值
4326167932f319cc80.png
▲ 图2. DIV_0_TRP位于bit4
6873967932f35da64e.png

▲ 图3. DIV_0_TRP参数说明
测试执行整型数除0操作代码。
6682467932f5a33394.png

1375567932f61db81e.png

▲ 图4. Fault Report-除0错误
1061167932f6aa7fc2.png

▲ 图5. 查看进入Hardfault的程序位置
7105167932f72ae730.png

▲ 图6. 找到因为除0导致的进入Hardfault

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

▲ 图7. FPSCR寄存器
执行浮点除0的测试代码:
8269167932f9def6fa.png
6298367932fa3d765c.png
▲ 图8. IAR的浮点除0后DZC标志位置位
1741567932fa96f792.png

▲ 图9. Keil浮点除0后DZC标志位有误
读取FPSCR寄存器,返回错误码0x02(除0操作)。
2013967932fb3f22e1.png
▲ 图10. 读取FPSCR

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

点击按钮下载《Cortex-M核除0操作的报错机制话题》原文档。


 楼主| STM新闻官 发表于 2025-1-24 14:16 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:意法半导体(中国)投资有限公司
简介:您的嵌入式应用将得益于意法半导体领先的产品架构、技术、多源产地和全方位支持。意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器。

1385

主题

1669

帖子

24

粉丝
快速回复 在线客服 返回列表 返回顶部