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

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

[复制链接]
STMCU-管管 发布时间:2025-2-6 09:10
" }; a. `* ]! Y

% `" `! G: A" f! K1. 前言8 _% ?6 Z+ A1 Y& L
除0操作属于错误操作,在ARM Cortex-M平台上会有相应的报错机制。但这边会涉及到整型数的除0以及浮点数的除0,另外还会涉及错误产生后的报错机制,是中断还是错误位,本文会对这个报错机制加以说明。使用STM32H723做为测试芯片。
. n* M4 \' b: X7 v1 t
. X- |9 K7 y3 j# a6 N. N2. 整形数除0操作报错 % T" g. m9 V' {5 P( m
默认情况下,STM32H723对整形数的除0操作,会忽略掉错误,原因在于默认情况下 SCB->CCR寄存器默认配置中这个除0操作是非捕获状态,如果想要系统报错,需要把 DIV_0_TRP这个位置1,这样,当执行除0操作的时候会进入hardfault,并且有标志位产生。
12.png
▲ 图1. SCB CCR默认地址和复位初值
13.png
▲ 图2. DIV_0_TRP位于bit4

# z# Q" P! c0 S% O
( i+ o3 P: h2 h! r6 j! l9 S! _
14.png
▲ 图3. DIV_0_TRP参数说明

. A" }9 k4 M+ s7 q! Y; c$ x
; }" _% c- [+ a+ _& O
测试执行整型数除0操作代码。. X- c4 B0 ^; }' y2 k! i5 \: l
  1. /* Enable System clock */
    5 Q8 `8 G) s0 M8 y% E: L$ t
  2. __HAL_RCC_SYSCFG_CLK_ENABLE();0 u7 h4 o# {+ t7 F/ [% {# K
  3. /* Enable DIV_0_TRP */9 {( G- A  d& P" G
  4. SCB->CCR |= (1<<4);/ l! b2 A; F) G, |) B
  5. /* Div value set to 0 */. ~3 O; x( @& s! n5 c8 r
  6. IDiv = 0;0 _# V. ]# H9 v/ ?6 J* a; R
  7. /* Exctue div 0 */; I7 `0 j% S. @6 K' ~4 O
  8. Iout = Iin/IDiv;
复制代码
15.png
▲ 图4. Fault Report-除0错误
16.png
▲ 图5. 查看进入Hardfault的程序位置

* S# f- o% [( Y) g' s/ K! g

$ ^9 e( F7 `0 ~" z* r7 Y2 I* L$ A
17.png
▲ 图6. 找到因为除0导致的进入Hardfault

7 I8 c* d& W) w% B( k- N4 z3. 浮点数除0的报错机制 ) v- i  ], W8 _6 ]! B; \3 h/ ?+ ]
浮点数的除0操作,没有专门的Hardfault触发机制,也就不能产生中断,只能通过对FPU单元的读取进行判别,而且在调试模式下,通过IAR读取寄存器的结果是正确的,而通过Keil的读取会有错误,实际已经发生了浮点除0操作,但Keil的FPU->SCR寄存器DZC没有置位。& p. q# U( S7 Z0 {9 O
18.png
▲ 图7. FPSCR寄存器
( k- J2 _: G; S

6 y0 K- E1 M3 i8 [' a执行浮点除0的测试代码:+ {" @+ M* d! D! ^5 {
  1. static volatile float fin = 0.9f,fout,fdiv;, W  |* g, i' ?/ U! I
  2. static volatile uint16_t Mark;5 E+ X* G; z! y! C4 Z
  3. /* Div value set to 0 */
    9 w2 C$ a2 k( O! Y9 H
  4. fdiv = 0.0f;
    * C3 g$ K6 N' e  V$ y- k# g
  5. /* Exctue float div 0 */
    * j- v4 p: g' f
  6. fout  = fin/fdiv;. [4 }# A5 ^2 q, g' r  d
  7. /* Get wrong mask value */0 Q5 s/ P, X- \8 t& \! o) H
  8. Mark = __get_FPSCR();
复制代码

' k0 B0 I* Y% P. s1 p( V. G
19.png
▲ 图8. IAR的浮点除0后DZC标志位置位

5 a  X6 c( y+ H6 Q- `% f

- i% p3 Q) T! g, T# L
20.png
▲ 图9. Keil浮点除0后DZC标志位有误

4 T+ w# @$ [. W% b/ O- w

+ s# H1 F, r1 Z1 Z4 N# s# C- ~读取FPSCR寄存器,返回错误码0x02(除0操作)。
; k" a0 T, i( o, ?
' E/ z6 p$ p! D$ \' _* X$ L
3 [3 n' T7 e7 h. r
21.png
▲ 图10. 读取FPSCR

+ g  v8 y3 ]' k4 s) E1 O

4 r5 {' _9 G7 X: D* R" ?
  l- }* I& g2 p, E3 @
. i6 A. c- c( m$ P* ]+ j0 c' L
4. 结论 # q3 w6 E0 M, X% N" K) a
本文通过对除0操作的报错机制做细致说明,可以看到整型除0可以有Hardfault的中断产生,而浮点的除0只能通过标志位判别,实际使用过程中尽量避免这种错误的操作。
' _, N- j9 Y1 \  F5 E9 }* X
7 n& w- q! B8 L" b
3 b; j; l+ b8 ~% W$ h2 M+ v
▼▼▼
点击按钮下载《Cortex-M核除0操作的报错机制话题》原文档。
! G% z# X- w. q2 j$ A5 H1 {2 S 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 手机版