你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

实战经验 | Cortex-M核除0操作的报错机制话题

[复制链接]
STMCU-管管 发布时间:2025-2-6 09:10

+ z8 P  [# S" A3 V9 Y) J
7 b7 J5 I5 z8 C
1. 前言+ C8 I! d8 p' l  C- v  F
除0操作属于错误操作,在ARM Cortex-M平台上会有相应的报错机制。但这边会涉及到整型数的除0以及浮点数的除0,另外还会涉及错误产生后的报错机制,是中断还是错误位,本文会对这个报错机制加以说明。使用STM32H723做为测试芯片。
1 x2 l* u) j) s! @
/ \/ e, q+ T' y  |& b7 n* l2. 整形数除0操作报错 4 ?# o1 w, Q! n: y/ _4 a
默认情况下,STM32H723对整形数的除0操作,会忽略掉错误,原因在于默认情况下 SCB->CCR寄存器默认配置中这个除0操作是非捕获状态,如果想要系统报错,需要把 DIV_0_TRP这个位置1,这样,当执行除0操作的时候会进入hardfault,并且有标志位产生。
12.png
▲ 图1. SCB CCR默认地址和复位初值
13.png
▲ 图2. DIV_0_TRP位于bit4
  L$ J! ]& A% W1 V

' s$ g! a: y# w9 V0 ?4 E# `
14.png
▲ 图3. DIV_0_TRP参数说明

) |8 }( i8 q) b; u/ g
3 R; D3 x9 Y4 n8 |4 L% L
测试执行整型数除0操作代码。7 V( Z7 l* o7 P0 M7 N) e7 ~6 u
  1. /* Enable System clock */
    : g& c; n+ n/ w) s. w
  2. __HAL_RCC_SYSCFG_CLK_ENABLE();
    $ F* Q' [! A# }; _0 }
  3. /* Enable DIV_0_TRP */' b& {' _" e1 P
  4. SCB->CCR |= (1<<4);
    # a! _0 F; k" P
  5. /* Div value set to 0 */
    5 d, n; v* C3 p& V# R+ M
  6. IDiv = 0;' D' E, e+ v% p! a' S7 h" K
  7. /* Exctue div 0 */& b! ^( g9 D4 d0 x: m' g
  8. Iout = Iin/IDiv;
复制代码
15.png
▲ 图4. Fault Report-除0错误
16.png
▲ 图5. 查看进入Hardfault的程序位置
+ Z- Q7 A& K' ~# [! O
; d# G: S# x$ Q/ v
17.png
▲ 图6. 找到因为除0导致的进入Hardfault

$ l$ n& o2 u2 e3 S$ g6 t3. 浮点数除0的报错机制 ) Z0 _: F: E2 D, g6 U& |6 e
浮点数的除0操作,没有专门的Hardfault触发机制,也就不能产生中断,只能通过对FPU单元的读取进行判别,而且在调试模式下,通过IAR读取寄存器的结果是正确的,而通过Keil的读取会有错误,实际已经发生了浮点除0操作,但Keil的FPU->SCR寄存器DZC没有置位。
& e" |6 _: n3 v* E( m" s
18.png
▲ 图7. FPSCR寄存器
3 O. d' ^7 z6 j. y; V
4 \) h3 U  L, K% E, N
执行浮点除0的测试代码:  M3 T+ w6 d/ e6 i, u7 Q
  1. static volatile float fin = 0.9f,fout,fdiv;# E, L. b9 w) F6 R5 u$ w
  2. static volatile uint16_t Mark;
    / v) q+ U3 }5 U8 p, g$ Q8 \
  3. /* Div value set to 0 */9 r% S5 S5 ]7 e0 \% q) y
  4. fdiv = 0.0f;/ T1 t" g" B: O0 B
  5. /* Exctue float div 0 */
    8 [3 Q: \8 ^$ x( n7 H% ?
  6. fout  = fin/fdiv;
    ! V7 a0 n+ t0 I8 i1 I
  7. /* Get wrong mask value */
    ) c: }" F9 `. J* i0 |) t; I4 e( m
  8. Mark = __get_FPSCR();
复制代码
$ Y; W9 d. m* s: x6 P2 H6 c: t
19.png
▲ 图8. IAR的浮点除0后DZC标志位置位

  u5 `! P6 K) l- s! w9 X
' f$ l6 M" f  u( g, [7 o4 M
20.png
▲ 图9. Keil浮点除0后DZC标志位有误

5 n5 ]2 m' y7 s2 z

6 `: T7 x2 I" R& Z读取FPSCR寄存器,返回错误码0x02(除0操作)。
7 B( D6 F5 f7 d
4 u6 \2 C) H" P

  i+ U4 O5 Y7 X1 ^
21.png
▲ 图10. 读取FPSCR

4 m  a& \' c, A) l, x

1 o/ F) H$ r3 l: v& z- N
3 w' |" P" R; T9 Q
) r5 r0 W! v' d! X# ?8 E# x
4. 结论
& G7 q7 W% ~* l5 F9 S! j/ t本文通过对除0操作的报错机制做细致说明,可以看到整型除0可以有Hardfault的中断产生,而浮点的除0只能通过标志位判别,实际使用过程中尽量避免这种错误的操作。. P4 ]* F9 U/ ~" P( [8 P
2 F+ R* o4 ~/ D9 v8 k2 p3 E
# m+ L/ b6 P# R* Y2 p/ i' a+ u
▼▼▼
点击按钮下载《Cortex-M核除0操作的报错机制话题》原文档。: b( v. y, t, X3 x  Y
LAT1423_Cortex-M核除0操作的报错机制话题_v1.0.pdf (515.22 KB, 下载次数: 0)
收藏 评论0 发布时间:2025-2-6 09:10

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版