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

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

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

; U; P- i) Y0 z/ [' S

0 ^. j) Q. p* Q5 q3 Z$ x1. 前言2 ^# Z" O7 H% g/ q4 y# ]
除0操作属于错误操作,在ARM Cortex-M平台上会有相应的报错机制。但这边会涉及到整型数的除0以及浮点数的除0,另外还会涉及错误产生后的报错机制,是中断还是错误位,本文会对这个报错机制加以说明。使用STM32H723做为测试芯片。; _( H% W" _" B) q# _
! J- c- u) ~/ e
2. 整形数除0操作报错 . @" d% L8 f& U$ T' Y
默认情况下,STM32H723对整形数的除0操作,会忽略掉错误,原因在于默认情况下 SCB->CCR寄存器默认配置中这个除0操作是非捕获状态,如果想要系统报错,需要把 DIV_0_TRP这个位置1,这样,当执行除0操作的时候会进入hardfault,并且有标志位产生。
12.png
▲ 图1. SCB CCR默认地址和复位初值
13.png
▲ 图2. DIV_0_TRP位于bit4
& Y3 P$ F$ |4 _! U

. b) ?0 ~# i  ]% l7 k- Z5 {; X
14.png
▲ 图3. DIV_0_TRP参数说明
1 e, ^, f3 n& ?

3 R+ U! e% |) N& q, {) A测试执行整型数除0操作代码。
& i2 R" `5 K* S6 A' w% a$ z# W
  1. /* Enable System clock */
    ' x( [8 O: L2 S3 n
  2. __HAL_RCC_SYSCFG_CLK_ENABLE();
    : @+ v9 A/ @, X% i% y
  3. /* Enable DIV_0_TRP */
    % x8 O0 w0 Q, m* A3 ~8 N( q
  4. SCB->CCR |= (1<<4);
    0 o: p( x5 J) Z) I8 j/ |
  5. /* Div value set to 0 */
    3 u3 M- ?7 ^" b9 h& X/ r
  6. IDiv = 0;
    3 @1 \1 y) N' M) s8 }& y" e
  7. /* Exctue div 0 */
    0 P0 Z: h  X" U! D1 E# B2 y3 f
  8. Iout = Iin/IDiv;
复制代码
15.png
▲ 图4. Fault Report-除0错误
16.png
▲ 图5. 查看进入Hardfault的程序位置
: t+ |# B% |1 I: B% Z9 H  {, U

  G% f- v& w) O, m2 G( ?: \
17.png
▲ 图6. 找到因为除0导致的进入Hardfault
9 D1 s4 y0 ?2 ~+ ]. B
3. 浮点数除0的报错机制
& [% `' x* I9 ]5 E0 Z) b; U浮点数的除0操作,没有专门的Hardfault触发机制,也就不能产生中断,只能通过对FPU单元的读取进行判别,而且在调试模式下,通过IAR读取寄存器的结果是正确的,而通过Keil的读取会有错误,实际已经发生了浮点除0操作,但Keil的FPU->SCR寄存器DZC没有置位。1 _- a% q" Z. _; V& _
18.png
▲ 图7. FPSCR寄存器

' M/ O# ]' ~9 N) ~' _
) J7 ]# A# q. b# W( X) U' H" U5 y
执行浮点除0的测试代码:  x: Y3 c2 L6 w+ H
  1. static volatile float fin = 0.9f,fout,fdiv;$ P/ R  x+ T/ A$ @
  2. static volatile uint16_t Mark;
    9 y4 h2 ]0 `4 [  Q- |' ?% a5 E
  3. /* Div value set to 0 */
    , M! v% V! o2 z( @6 j
  4. fdiv = 0.0f;
    4 c9 H* z, p8 |5 Z! D
  5. /* Exctue float div 0 */) H' ^+ |7 J( M' [  U' O
  6. fout  = fin/fdiv;
    " M) ^6 Q, r+ B% P) d% Y
  7. /* Get wrong mask value */6 J# b# R  }; h6 d' z. S
  8. Mark = __get_FPSCR();
复制代码
1 E5 o- O$ X# X, u( S& N
19.png
▲ 图8. IAR的浮点除0后DZC标志位置位
+ b3 x/ t! y/ |+ }7 b2 c- b( {4 r

* G. ^3 |8 j% Z; ]9 ?; i, ]
20.png
▲ 图9. Keil浮点除0后DZC标志位有误

' x0 F/ c6 C7 U$ p5 [
6 j7 H1 W- H! p" e; l+ w; N+ @' d
读取FPSCR寄存器,返回错误码0x02(除0操作)。
" U6 T8 a6 m. T; [/ I8 s7 {, O
, ]) v/ [3 I" Y" c- Z0 u( P- r
4 [( |! U! {+ a
21.png
▲ 图10. 读取FPSCR

5 J" t3 E  w+ u6 f. {: J

- U: n' i4 V# j* j( y, m2 k, B
  q) V! y8 p# a; Z" S
# W6 I4 e; `  C4 G
4. 结论
) `. L* e" P" [/ D本文通过对除0操作的报错机制做细致说明,可以看到整型除0可以有Hardfault的中断产生,而浮点的除0只能通过标志位判别,实际使用过程中尽量避免这种错误的操作。1 X7 z! ?- x! c4 j2 F
) Q# `* w" I( ~; Z
3 H8 V4 u) l8 _2 H; j# ]
▼▼▼
点击按钮下载《Cortex-M核除0操作的报错机制话题》原文档。2 N, N9 n7 o7 v3 k
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 手机版