|
4 c% Z+ D" u$ t9 h6 W9 D' X: A ! D, `7 o7 S3 }$ j+ ~1 d 1. 前言 除0操作属于错误操作,在ARM Cortex-M平台上会有相应的报错机制。但这边会涉及到整型数的除0以及浮点数的除0,另外还会涉及错误产生后的报错机制,是中断还是错误位,本文会对这个报错机制加以说明。使用STM32H723做为测试芯片。9 ~% ? n% v8 U: I9 c; V 2 `+ [, k& U5 ~ 2. 整形数除0操作报错 默认情况下,STM32H723对整形数的除0操作,会忽略掉错误,原因在于默认情况下 SCB->CCR寄存器默认配置中这个除0操作是非捕获状态,如果想要系统报错,需要把 DIV_0_TRP这个位置1,这样,当执行除0操作的时候会进入hardfault,并且有标志位产生。
▲ 图1. SCB CCR默认地址和复位初值
▲ 图2. DIV_0_TRP位于bit4 0 a8 h) @/ B1 f- i8 F2 ~. t1 h' z9 V; \: K# M
▲ 图3. DIV_0_TRP参数说明 ; ~5 U4 Y% G" s4 u/ j( e2 a; p. H6 A% _: p. `8 v 测试执行整型数除0操作代码。7 L, A- v/ l! y
▲ 图4. Fault Report-除0错误
▲ 图5. 查看进入Hardfault的程序位置 9 t4 D' l; f7 Q! a- N( l0 i- I! ?3 l; @0 A. y% L. d5 [; V/ c' f& O0 {
▲ 图6. 找到因为除0导致的进入Hardfault 3. 浮点数除0的报错机制 浮点数的除0操作,没有专门的Hardfault触发机制,也就不能产生中断,只能通过对FPU单元的读取进行判别,而且在调试模式下,通过IAR读取寄存器的结果是正确的,而通过Keil的读取会有错误,实际已经发生了浮点除0操作,但Keil的FPU->SCR寄存器DZC没有置位。
▲ 图7. FPSCR寄存器 1 R/ A! N$ p( |! P s" I4 j$ J6 }1 u9 |, M& o0 s4 t; y6 l 执行浮点除0的测试代码:4 p! v6 Z" n% m) q% m5 r: K
▲ 图8. IAR的浮点除0后DZC标志位置位
▲ 图9. Keil浮点除0后DZC标志位有误 $ B, n8 N( V. s& D# o+ [" t& F& A. o: q 读取FPSCR寄存器,返回错误码0x02(除0操作)。 ' k4 p4 }2 Z1 p1 ]2 R" Y0 x. y
▲ 图10. 读取FPSCR ) Y8 F: ^, m" s- Q! p' n/ Z- W9 R* h$ ]7 T - q+ Q" D& o; l 4. 结论 0 x3 ^: u4 n/ y3 ` 本文通过对除0操作的报错机制做细致说明,可以看到整型除0可以有Hardfault的中断产生,而浮点的除0只能通过标志位判别,实际使用过程中尽量避免这种错误的操作。! k( G) w4 D& w: q3 O) O' U ▼▼▼ 点击按钮下载《Cortex-M核除0操作的报错机制话题》原文档。
LAT1423_Cortex-M核除0操作的报错机制话题_v1.0.pdf
(515.22 KB, 下载次数: 0)
|
《MCUBoot课程》学习笔记+数据与镜像的烧录
《MCUBoot课程》学习笔记+工程BuildActions示例
《MCUBoot课程》学习笔记+工程的BuildActions
《MCUBoot课程》学习笔记+安全启动秘钥存储
《MCUBoot课程》学习笔记+Memory布局
《MCUBoot课程》学习笔记+平台初始化与驱动
ST全新高功率AI服务器电源设计学习记录
经验分享 | LAT1422 STM32 AFCI 方案 TensorBoard 的使用介绍
STM32 LAT实战经验资料汇总分享(260205)
我中奖啦,收到了STM32开发板,足足开心了一整天啊
微信公众号
手机版