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

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

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

$ \4 ^3 E  k" g/ B& c

5 }( K4 o; S! P7 n6 z  X1. 前言7 h3 I6 P) h6 D% Z! i; Q
除0操作属于错误操作,在ARM Cortex-M平台上会有相应的报错机制。但这边会涉及到整型数的除0以及浮点数的除0,另外还会涉及错误产生后的报错机制,是中断还是错误位,本文会对这个报错机制加以说明。使用STM32H723做为测试芯片。2 z# w$ c7 m+ e

9 J% A! }4 O1 J- j2. 整形数除0操作报错 0 n5 @& O* O0 n
默认情况下,STM32H723对整形数的除0操作,会忽略掉错误,原因在于默认情况下 SCB->CCR寄存器默认配置中这个除0操作是非捕获状态,如果想要系统报错,需要把 DIV_0_TRP这个位置1,这样,当执行除0操作的时候会进入hardfault,并且有标志位产生。
12.png
▲ 图1. SCB CCR默认地址和复位初值
13.png
▲ 图2. DIV_0_TRP位于bit4
) s- r7 t: u9 _# n( h( t4 j( X

  z/ A3 V. v% w# j3 t$ T
14.png
▲ 图3. DIV_0_TRP参数说明
) q. J, C& W( D* R+ d5 F. ~2 e* s
. Q3 U) p$ T& V
测试执行整型数除0操作代码。% Z3 H! `/ V% r% n2 |
  1. /* Enable System clock */
    6 o( h: y& w8 u, ~
  2. __HAL_RCC_SYSCFG_CLK_ENABLE();
    7 s2 }8 K6 _* G. V" U* ~) m
  3. /* Enable DIV_0_TRP */% g3 Q; V* F( ?. Q& g  Y
  4. SCB->CCR |= (1<<4);
    3 Q7 _# b; J6 U1 h# a
  5. /* Div value set to 0 */
    1 N2 M( I# s8 `) q' g+ o9 @
  6. IDiv = 0;
    ( e: r4 k8 B+ n* T
  7. /* Exctue div 0 */
    9 W# _% p6 {9 g6 @9 G! ?+ b0 W
  8. Iout = Iin/IDiv;
复制代码
15.png
▲ 图4. Fault Report-除0错误
16.png
▲ 图5. 查看进入Hardfault的程序位置
) ^$ Z7 M2 s, Z, X

5 B3 p* {: K8 N. z+ f3 l
17.png
▲ 图6. 找到因为除0导致的进入Hardfault

$ [) B, c' O; q: N3. 浮点数除0的报错机制
& i! A# t+ y( V" G; S浮点数的除0操作,没有专门的Hardfault触发机制,也就不能产生中断,只能通过对FPU单元的读取进行判别,而且在调试模式下,通过IAR读取寄存器的结果是正确的,而通过Keil的读取会有错误,实际已经发生了浮点除0操作,但Keil的FPU->SCR寄存器DZC没有置位。3 h; N0 T0 U3 [( {% R4 {5 \1 w
18.png
▲ 图7. FPSCR寄存器

3 M5 w7 |8 z/ x4 g
" y, R; o/ w* E0 A
执行浮点除0的测试代码:: n$ d9 `; o4 s. X$ r( S3 N
  1. static volatile float fin = 0.9f,fout,fdiv;
    . A, T7 @7 S3 q# W1 x  i5 m
  2. static volatile uint16_t Mark;
    2 X3 K' A4 W8 F1 M  c' q& D
  3. /* Div value set to 0 */
    7 G& m: L8 x' z) q* I6 L! A. K
  4. fdiv = 0.0f;7 @2 k8 G. I8 k+ S( d
  5. /* Exctue float div 0 */
    " a  C: u( v0 v4 ^( ^6 [0 O" [
  6. fout  = fin/fdiv;: g7 j9 Y7 n3 S% p6 g" l2 i* r% k
  7. /* Get wrong mask value */
    ' T/ X! I! _$ a' `* Z4 r
  8. Mark = __get_FPSCR();
复制代码
- V: ?: B1 v7 Y% r6 @; a# t
19.png
▲ 图8. IAR的浮点除0后DZC标志位置位
. m# Y8 O" ~0 c2 }
; a$ c/ W8 J: |% V# m3 I+ i
20.png
▲ 图9. Keil浮点除0后DZC标志位有误

8 W4 D; g7 ?  l( X/ m

3 l% z* g5 y0 v( H读取FPSCR寄存器,返回错误码0x02(除0操作)。
4 B# B, K3 K  ]- t; m2 f
3 w4 [& F% s' L( M: o' |* p; `
" g) p; s( C+ M: p) W/ h2 H
21.png
▲ 图10. 读取FPSCR
' N- i  J" H3 y

$ m- U9 n2 M& U- _
1 U3 I8 E( c# c

! O9 L, t0 S) x- o4. 结论 ; q" z7 Y" a4 ~. }' o3 \: `
本文通过对除0操作的报错机制做细致说明,可以看到整型除0可以有Hardfault的中断产生,而浮点的除0只能通过标志位判别,实际使用过程中尽量避免这种错误的操作。
& S; M. w6 F4 U2 T
8 s8 ?0 ~* D+ Q& r8 G

7 B9 q$ |, Z( {2 ?8 v+ x) O% A& _
▼▼▼
点击按钮下载《Cortex-M核除0操作的报错机制话题》原文档。
* b" k1 p# F9 [# S+ [8 o9 m* i9 h 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 手机版