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

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

[复制链接]
STMCU-管管 发布时间:2025-2-6 09:10
$ ~6 X3 _, Y5 {, r' L5 h

2 W) T, l( b) \8 ^; ]9 f- [1. 前言
: h" H+ ~8 G0 k- W# ~) r- c除0操作属于错误操作,在ARM Cortex-M平台上会有相应的报错机制。但这边会涉及到整型数的除0以及浮点数的除0,另外还会涉及错误产生后的报错机制,是中断还是错误位,本文会对这个报错机制加以说明。使用STM32H723做为测试芯片。9 G. _3 v% w# b" O8 \% t- q

6 N  [5 g8 h+ E) c( e- [$ z# r2. 整形数除0操作报错 1 t& s* Y! P0 l  j2 K2 ?8 {
默认情况下,STM32H723对整形数的除0操作,会忽略掉错误,原因在于默认情况下 SCB->CCR寄存器默认配置中这个除0操作是非捕获状态,如果想要系统报错,需要把 DIV_0_TRP这个位置1,这样,当执行除0操作的时候会进入hardfault,并且有标志位产生。
12.png
▲ 图1. SCB CCR默认地址和复位初值
13.png
▲ 图2. DIV_0_TRP位于bit4

. p2 r3 \) n  b; [- N
' u2 g* k& ^6 P( [9 N: q% ]
14.png
▲ 图3. DIV_0_TRP参数说明

1 y* y& _# y4 Q+ N6 z

+ h, c- N+ w2 W5 T测试执行整型数除0操作代码。/ v" B: W5 ~( c( L$ m
  1. /* Enable System clock */5 y5 |' j! ~- f
  2. __HAL_RCC_SYSCFG_CLK_ENABLE();
    & t# n& g, }# w1 R
  3. /* Enable DIV_0_TRP */8 ^; b) ?& y" J
  4. SCB->CCR |= (1<<4);7 R/ f& G9 Q% u/ B% _
  5. /* Div value set to 0 */
    1 t* M/ \" }& i. E: L* H
  6. IDiv = 0;& ?& x3 |) |8 f) _  F/ x
  7. /* Exctue div 0 */7 T; G& _! p5 e- l
  8. Iout = Iin/IDiv;
复制代码
15.png
▲ 图4. Fault Report-除0错误
16.png
▲ 图5. 查看进入Hardfault的程序位置
  n( S; U/ T/ y9 f& {
) W/ U7 ]5 ?( Y/ e& [. x7 U
17.png
▲ 图6. 找到因为除0导致的进入Hardfault
0 C6 Z! q3 }* ~: p1 C+ p( O
3. 浮点数除0的报错机制 4 C( U1 K( I/ y" `! D. @
浮点数的除0操作,没有专门的Hardfault触发机制,也就不能产生中断,只能通过对FPU单元的读取进行判别,而且在调试模式下,通过IAR读取寄存器的结果是正确的,而通过Keil的读取会有错误,实际已经发生了浮点除0操作,但Keil的FPU->SCR寄存器DZC没有置位。
- ]0 ]9 V' C, N" P# [
18.png
▲ 图7. FPSCR寄存器
# ?/ V9 Q& ^3 \- J6 F, _
: I0 e9 v) v0 @9 q7 @' }7 L
执行浮点除0的测试代码:9 U9 s% p# y- X( k% l( O
  1. static volatile float fin = 0.9f,fout,fdiv;( ^& _; m: z# q# u
  2. static volatile uint16_t Mark;' y& T5 ^7 X; K! N0 O
  3. /* Div value set to 0 */
    4 b; t7 ^7 N5 Y. y/ z
  4. fdiv = 0.0f;- F! B+ T( Y" r3 x* {0 o& J: T
  5. /* Exctue float div 0 */  M( o0 v% u. Q# d' p# X* {
  6. fout  = fin/fdiv;
    ( T2 K6 L& h1 G7 P  b: W! ^) I- U
  7. /* Get wrong mask value */
    . k) q1 i7 |/ l' R- Q: N: N9 Q0 W# H
  8. Mark = __get_FPSCR();
复制代码

% w; U4 u& f7 V! c: N: _4 W
19.png
▲ 图8. IAR的浮点除0后DZC标志位置位

/ ?0 i+ n$ D  x4 t9 y

1 U9 C# c' d, @" U9 ~
20.png
▲ 图9. Keil浮点除0后DZC标志位有误
& J9 n; |3 g1 |8 x& E

- c4 d- J$ D, v, ?- |读取FPSCR寄存器,返回错误码0x02(除0操作)。
4 T9 h2 d8 r3 U. X% U( P5 I* \9 O3 ?- g: X9 F* D

$ |% s) w3 i" v1 g) K
21.png
▲ 图10. 读取FPSCR

: _  I# H+ C4 a6 [' q8 J
2 d% z4 `8 O. M

4 k1 E0 w4 t+ K5 I; K

8 w2 l1 _" @3 h* u& T0 R5 E6 M4. 结论 4 k3 a! Z7 j* l4 |
本文通过对除0操作的报错机制做细致说明,可以看到整型除0可以有Hardfault的中断产生,而浮点的除0只能通过标志位判别,实际使用过程中尽量避免这种错误的操作。
7 E( t) V% x* R; J6 u$ k9 u9 [5 b2 @& T. d& o$ ~

. ^' i& U4 @. s, L) T6 @0 t
▼▼▼
点击按钮下载《Cortex-M核除0操作的报错机制话题》原文档。
+ k' j2 {4 _' w+ 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 手机版