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

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

[复制链接]
STMCU-管管 发布时间:2025-2-6 09:10
. T; z: g6 R, S, N

' }6 l( p9 D" _1. 前言
/ H9 t+ F) H9 C! f' k除0操作属于错误操作,在ARM Cortex-M平台上会有相应的报错机制。但这边会涉及到整型数的除0以及浮点数的除0,另外还会涉及错误产生后的报错机制,是中断还是错误位,本文会对这个报错机制加以说明。使用STM32H723做为测试芯片。$ K% y" S' n2 }% q' r
: z9 {5 Y) w5 S3 M
2. 整形数除0操作报错
/ F8 ?9 M: w; s1 E
默认情况下,STM32H723对整形数的除0操作,会忽略掉错误,原因在于默认情况下 SCB->CCR寄存器默认配置中这个除0操作是非捕获状态,如果想要系统报错,需要把 DIV_0_TRP这个位置1,这样,当执行除0操作的时候会进入hardfault,并且有标志位产生。
12.png
▲ 图1. SCB CCR默认地址和复位初值
13.png
▲ 图2. DIV_0_TRP位于bit4

# a! Z# J! V. j# B) }+ o0 D$ i

: j& B' `) S9 h( s
14.png
▲ 图3. DIV_0_TRP参数说明

6 |. |; b/ O, ^

  U# K. C" u: l! I- ~测试执行整型数除0操作代码。
1 D7 V$ l- _0 w' ?
  1. /* Enable System clock */" V3 G% V/ a3 t7 Y( r4 ~" q. j
  2. __HAL_RCC_SYSCFG_CLK_ENABLE();
    " K( A- Y- ^6 w' ?( H7 T: G- n
  3. /* Enable DIV_0_TRP */0 x1 Z8 @9 N0 R2 o5 {1 B/ j+ p
  4. SCB->CCR |= (1<<4);
    2 B3 O: o" E% {6 E- Y
  5. /* Div value set to 0 */0 E% u. o- Y' q' E. G' T% X$ k
  6. IDiv = 0;1 \2 r  l4 C# r4 N+ H/ C% R  d- _8 \$ h
  7. /* Exctue div 0 */5 y( F7 x4 r3 U0 |1 H2 c/ f4 e0 c0 a
  8. Iout = Iin/IDiv;
复制代码
15.png
▲ 图4. Fault Report-除0错误
16.png
▲ 图5. 查看进入Hardfault的程序位置
1 ~  z7 B# a! Y7 X% V- O
9 \* a- V1 C. ^. B$ G
17.png
▲ 图6. 找到因为除0导致的进入Hardfault

5 n$ V2 U, _( A7 ^3. 浮点数除0的报错机制
" L9 t. x" T- h. l  b! `5 s8 w% [. [( M浮点数的除0操作,没有专门的Hardfault触发机制,也就不能产生中断,只能通过对FPU单元的读取进行判别,而且在调试模式下,通过IAR读取寄存器的结果是正确的,而通过Keil的读取会有错误,实际已经发生了浮点除0操作,但Keil的FPU->SCR寄存器DZC没有置位。
8 ~' b& W6 l) T  `) E6 N+ E. H9 h
18.png
▲ 图7. FPSCR寄存器
, B* l- {/ s; J; U
0 }- R& z7 }- ~3 L! X
执行浮点除0的测试代码:
: d! M( V2 q: Z. O
  1. static volatile float fin = 0.9f,fout,fdiv;
    8 [. N  S( }; {
  2. static volatile uint16_t Mark;
    , ]/ ^8 W8 q  I* u
  3. /* Div value set to 0 */, z5 W+ f5 o+ A) f' j
  4. fdiv = 0.0f;  M4 b  d- x* d1 m. [' j, j
  5. /* Exctue float div 0 */) d" B# L) M% Q6 }
  6. fout  = fin/fdiv;
    & Z7 z3 z, R) E! l
  7. /* Get wrong mask value */
    ) h" f3 ~* _* U$ P% i1 h) I
  8. Mark = __get_FPSCR();
复制代码
5 g4 W& F( d6 Z" M1 ]3 ~- z+ K! {0 S" P
19.png
▲ 图8. IAR的浮点除0后DZC标志位置位

- d8 l( H4 L; ^1 O

1 f6 \" l8 j) g' d5 d, Y( x" x' }6 h* h
20.png
▲ 图9. Keil浮点除0后DZC标志位有误
) x) U8 x( {: u5 P; u# n7 B% S
3 H2 }2 @) e9 L6 i" o! q) s0 G
读取FPSCR寄存器,返回错误码0x02(除0操作)。& {4 W2 z1 N, ~) a/ ~
) n5 u* Q  _/ M" H" m* k

4 e0 W% G$ H0 L; ?- {) [& A
21.png
▲ 图10. 读取FPSCR

* R  [: ~, a4 C# w
! a* l" I# ]7 J9 N5 }0 g' K

1 C: S+ D1 S* D0 x
3 Z( E9 _. n8 T  Q0 Q' V8 M
4. 结论   i) m* B/ l7 z- Z# Q
本文通过对除0操作的报错机制做细致说明,可以看到整型除0可以有Hardfault的中断产生,而浮点的除0只能通过标志位判别,实际使用过程中尽量避免这种错误的操作。
6 @$ f$ t$ B1 Z& L
) B' D% T, s9 t' I( \+ _9 D

  l: }  J# y" ?* s( [& Q
▼▼▼
点击按钮下载《Cortex-M核除0操作的报错机制话题》原文档。
" ?1 p3 p% m1 d5 W& e LAT1423_Cortex-M核除0操作的报错机制话题_v1.0.pdf (515.22 KB, 下载次数: 0)
赞 收藏 评论0 发布时间:2025-2-6 09:10

举报

0个回答

所属标签

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版