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

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

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

- V+ k" y" `' ]$ D

% Z1 @, j; M- B. \; q  m& l1. 前言( }2 y/ U& e" q# l
除0操作属于错误操作,在ARM Cortex-M平台上会有相应的报错机制。但这边会涉及到整型数的除0以及浮点数的除0,另外还会涉及错误产生后的报错机制,是中断还是错误位,本文会对这个报错机制加以说明。使用STM32H723做为测试芯片。3 _3 k/ J- v% S1 B/ T3 L9 f! P6 i: S
$ S" f5 j1 C( A- z3 m1 J4 n
2. 整形数除0操作报错 + R6 I6 _8 C  N, G9 w4 f, L1 m( o
默认情况下,STM32H723对整形数的除0操作,会忽略掉错误,原因在于默认情况下 SCB->CCR寄存器默认配置中这个除0操作是非捕获状态,如果想要系统报错,需要把 DIV_0_TRP这个位置1,这样,当执行除0操作的时候会进入hardfault,并且有标志位产生。
12.png
▲ 图1. SCB CCR默认地址和复位初值
13.png
▲ 图2. DIV_0_TRP位于bit4

8 R/ J) i4 T& D. ]
5 @  q0 |- n) g9 k8 P: h
14.png
▲ 图3. DIV_0_TRP参数说明
: Y) g$ j' Z+ I. N$ V

! O- s" m' B, P3 t) {+ x- a# ^- P测试执行整型数除0操作代码。
6 h7 S2 a5 E0 H% H
  1. /* Enable System clock */
    " L( s4 q2 O6 c  ]5 Q
  2. __HAL_RCC_SYSCFG_CLK_ENABLE();
    & q# M% e7 b2 `; Q
  3. /* Enable DIV_0_TRP */
    ' j2 m4 x9 y0 n( s7 j8 G
  4. SCB->CCR |= (1<<4);
    6 R; I- I# V9 _- s8 s
  5. /* Div value set to 0 */; w7 F! ?( J2 z1 Z* W: S
  6. IDiv = 0;
    , ~8 s" `" u( B( B" E) U
  7. /* Exctue div 0 */
    8 S* |# v, y# Z% {
  8. Iout = Iin/IDiv;
复制代码
15.png
▲ 图4. Fault Report-除0错误
16.png
▲ 图5. 查看进入Hardfault的程序位置
2 x- s7 H$ p; H  F5 b
! Z: K  F1 u! {  N9 _- f) {
17.png
▲ 图6. 找到因为除0导致的进入Hardfault

. J  f$ w7 B5 J% S) i3. 浮点数除0的报错机制
1 _$ R' F( g5 m( q2 K% U浮点数的除0操作,没有专门的Hardfault触发机制,也就不能产生中断,只能通过对FPU单元的读取进行判别,而且在调试模式下,通过IAR读取寄存器的结果是正确的,而通过Keil的读取会有错误,实际已经发生了浮点除0操作,但Keil的FPU->SCR寄存器DZC没有置位。
2 G& }6 r) a+ `0 h5 K9 S  O, ~
18.png
▲ 图7. FPSCR寄存器
2 a$ Z9 `2 P4 p

) E+ v/ r  k5 _9 e) B3 g5 V执行浮点除0的测试代码:( L$ @' a! q) c% |, E! V/ V
  1. static volatile float fin = 0.9f,fout,fdiv;
    1 \. ~: o( L& D. F0 |: t
  2. static volatile uint16_t Mark;/ R6 z5 h. A9 r" V# X1 h: i
  3. /* Div value set to 0 */- R  ?! S# f3 w) f  T9 `7 ]
  4. fdiv = 0.0f;
    4 |( x% d  l& x* S
  5. /* Exctue float div 0 */; W+ X! t% X1 J( C- f1 W9 Q8 g0 {: G
  6. fout  = fin/fdiv;3 V/ t8 v" B& ~  w: }
  7. /* Get wrong mask value */
    - C0 E/ ?  I0 X
  8. Mark = __get_FPSCR();
复制代码

4 r% N  C# Y3 W  y! |$ X
19.png
▲ 图8. IAR的浮点除0后DZC标志位置位
( [; s" d' d/ k7 ]9 e9 K& L
, l1 p' n5 X2 t4 r
20.png
▲ 图9. Keil浮点除0后DZC标志位有误
. b  V% ~$ E/ f* g

6 p8 x! x1 U! d; k读取FPSCR寄存器,返回错误码0x02(除0操作)。( q7 s/ @8 W3 ?0 o2 [- H

/ K( I, ~8 a( P* t, K  N
5 G2 w$ C. w9 W
21.png
▲ 图10. 读取FPSCR
+ n" t" f+ K! j0 q. t1 L
7 E- t" y9 \: H8 t" ^

0 z' M8 x/ c% l9 p* Z- x# S

8 V3 v  Q8 j% A4. 结论 . Z( U2 B2 {3 x6 D4 M% ~. @( K
本文通过对除0操作的报错机制做细致说明,可以看到整型除0可以有Hardfault的中断产生,而浮点的除0只能通过标志位判别,实际使用过程中尽量避免这种错误的操作。
0 e# Z9 J9 [/ r: Y5 u
+ U$ S# m& P0 O3 N

) w- v! I3 @8 J$ v( v* E  |9 j
▼▼▼
点击按钮下载《Cortex-M核除0操作的报错机制话题》原文档。! A6 C" j8 V' o6 X5 p" Q& C* t3 ^2 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 手机版