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

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

[复制链接]
STMCU-管管 发布时间:2025-2-6 09:10
+ C- G. f( A3 B" _3 w. a2 [

9 s9 e* i9 f" ?! A% j1. 前言5 A3 |! L4 ~0 H4 X2 J  e2 f
除0操作属于错误操作,在ARM Cortex-M平台上会有相应的报错机制。但这边会涉及到整型数的除0以及浮点数的除0,另外还会涉及错误产生后的报错机制,是中断还是错误位,本文会对这个报错机制加以说明。使用STM32H723做为测试芯片。
) q! h, U* y- f1 G  ^8 o
! J9 O$ b/ W! l5 S4 F& u+ K( S2. 整形数除0操作报错   _6 @5 e( p- I# Z% X
默认情况下,STM32H723对整形数的除0操作,会忽略掉错误,原因在于默认情况下 SCB->CCR寄存器默认配置中这个除0操作是非捕获状态,如果想要系统报错,需要把 DIV_0_TRP这个位置1,这样,当执行除0操作的时候会进入hardfault,并且有标志位产生。
12.png
▲ 图1. SCB CCR默认地址和复位初值
13.png
▲ 图2. DIV_0_TRP位于bit4
1 b+ h6 s  L) Q/ k2 a* e6 {

; l, E4 {# u. \8 T
14.png
▲ 图3. DIV_0_TRP参数说明

  M; E+ K, h* y

% ?3 b) q# M1 U; J5 O0 S! ^测试执行整型数除0操作代码。/ R: O9 P4 b  O) x+ ~7 ?& q0 J$ R
  1. /* Enable System clock */
    / r- v% V& S+ H4 i5 ]" J8 N; O
  2. __HAL_RCC_SYSCFG_CLK_ENABLE();7 k7 {8 f6 Z: G& l
  3. /* Enable DIV_0_TRP */
    ) Z  p- l$ O' d+ R
  4. SCB->CCR |= (1<<4);
    2 B, R$ C; R( u2 V# X6 f9 [
  5. /* Div value set to 0 */
    $ t2 I3 d1 P; [! p4 B
  6. IDiv = 0;
    6 ]5 U0 w& @) f4 @  o. w
  7. /* Exctue div 0 */" ^$ O! b0 L+ t: C6 l5 k
  8. Iout = Iin/IDiv;
复制代码
15.png
▲ 图4. Fault Report-除0错误
16.png
▲ 图5. 查看进入Hardfault的程序位置
$ R8 l' S4 v* l0 {. h7 H) v' o

# O0 ]  ^: I' I2 S
17.png
▲ 图6. 找到因为除0导致的进入Hardfault

2 B; [: h: S8 }, c  @2 h/ H. f6 b3. 浮点数除0的报错机制
6 R% c% X$ q8 o3 E' |7 A! `浮点数的除0操作,没有专门的Hardfault触发机制,也就不能产生中断,只能通过对FPU单元的读取进行判别,而且在调试模式下,通过IAR读取寄存器的结果是正确的,而通过Keil的读取会有错误,实际已经发生了浮点除0操作,但Keil的FPU->SCR寄存器DZC没有置位。
( x. F+ I# d" m- f2 b* o$ _
18.png
▲ 图7. FPSCR寄存器

2 v7 D6 w" r' p4 ?) Q

1 q: Z# I2 i9 P: m1 `执行浮点除0的测试代码:
* U% G1 l' U' w
  1. static volatile float fin = 0.9f,fout,fdiv;
    1 O5 |" ]1 j+ l  z
  2. static volatile uint16_t Mark;
    6 Z& ~1 V0 f0 R: z
  3. /* Div value set to 0 */; v! _/ Z  j1 C0 I
  4. fdiv = 0.0f;+ u1 h) ]8 S" ]% [1 r" @! p  O
  5. /* Exctue float div 0 */9 ]9 A1 {2 ?- Z4 L7 ~/ J  D# x
  6. fout  = fin/fdiv;' v5 D. M6 \) P2 I+ b
  7. /* Get wrong mask value */3 E9 U8 ?9 n& T  q$ R
  8. Mark = __get_FPSCR();
复制代码
1 j' F/ F/ k; Y1 y  Z
19.png
▲ 图8. IAR的浮点除0后DZC标志位置位

$ B' G# ^2 i: Q. @8 }) N
" V3 W& R; k& z% f, F7 H
20.png
▲ 图9. Keil浮点除0后DZC标志位有误

* k, w$ P+ d  g! [$ _

# T& r$ _* g; \  v读取FPSCR寄存器,返回错误码0x02(除0操作)。" ~! W* s+ c) T1 i% I

- F1 \% I) V$ C1 @2 D! \% m" E! \0 w
0 @7 C& `4 A3 k# V8 I' Z* ~( _
21.png
▲ 图10. 读取FPSCR

& k& e# o( t( H1 |& o8 z+ n
, i, a% E' F" Y, [: P6 F5 ]

( T) ?+ t1 _% A8 k

/ l5 H4 K5 T6 A$ s7 T* F4. 结论
1 ?( w6 B3 `- e本文通过对除0操作的报错机制做细致说明,可以看到整型除0可以有Hardfault的中断产生,而浮点的除0只能通过标志位判别,实际使用过程中尽量避免这种错误的操作。
- V4 f# R0 b- U* U3 d' e
! `0 K) p0 {$ f2 v  b
" R$ d7 a, `) R: {4 E
▼▼▼
点击按钮下载《Cortex-M核除0操作的报错机制话题》原文档。: E/ q5 F. D% o7 |: v
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 手机版