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

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

[复制链接]
STMCU-管管 发布时间:2025-2-6 09:10
! D) j+ y0 H2 L5 r3 j

0 z$ H3 o8 r. v" y1. 前言
# d  E8 l1 H7 m除0操作属于错误操作,在ARM Cortex-M平台上会有相应的报错机制。但这边会涉及到整型数的除0以及浮点数的除0,另外还会涉及错误产生后的报错机制,是中断还是错误位,本文会对这个报错机制加以说明。使用STM32H723做为测试芯片。1 M9 E9 V1 P5 T6 D7 L- b

- O5 W3 c! M- m2 ^% ~2. 整形数除0操作报错 5 J' `/ ^1 R: g! h# j, S, f
默认情况下,STM32H723对整形数的除0操作,会忽略掉错误,原因在于默认情况下 SCB->CCR寄存器默认配置中这个除0操作是非捕获状态,如果想要系统报错,需要把 DIV_0_TRP这个位置1,这样,当执行除0操作的时候会进入hardfault,并且有标志位产生。
12.png
▲ 图1. SCB CCR默认地址和复位初值
13.png
▲ 图2. DIV_0_TRP位于bit4

( T$ {+ [2 L5 q  x3 H
1 m+ k' C" T0 S( @3 {
14.png
▲ 图3. DIV_0_TRP参数说明
6 [6 \* I6 l# O) B+ R8 E

8 r0 {8 x: n/ h* C# @  z& v/ q8 y  K测试执行整型数除0操作代码。
8 ?9 f) {5 i/ V# U- L/ b% ~
  1. /* Enable System clock */
    - w! O1 W7 G! |0 q; x( ?- q3 P3 R
  2. __HAL_RCC_SYSCFG_CLK_ENABLE();
    ) b+ B4 Z3 i& f- G" {
  3. /* Enable DIV_0_TRP */
    . z# r$ l/ p# W1 h* S
  4. SCB->CCR |= (1<<4);4 g' ]7 `3 Z- J3 b2 }5 D, _
  5. /* Div value set to 0 */
    8 ?0 H4 v; _* D* t" A
  6. IDiv = 0;% U% b& I: |/ j2 W" B3 Y
  7. /* Exctue div 0 */
    3 z; [6 B( j/ M+ ^
  8. Iout = Iin/IDiv;
复制代码
15.png
▲ 图4. Fault Report-除0错误
16.png
▲ 图5. 查看进入Hardfault的程序位置
* N% Y$ L1 B- z$ D4 p

% P% e2 q: p1 q" J& d' Z) O( a& l
17.png
▲ 图6. 找到因为除0导致的进入Hardfault
9 h# u# w2 p5 z
3. 浮点数除0的报错机制 & `0 A, ^6 L( b! |% z7 d7 y
浮点数的除0操作,没有专门的Hardfault触发机制,也就不能产生中断,只能通过对FPU单元的读取进行判别,而且在调试模式下,通过IAR读取寄存器的结果是正确的,而通过Keil的读取会有错误,实际已经发生了浮点除0操作,但Keil的FPU->SCR寄存器DZC没有置位。
% j* A( G# ?" q" X
18.png
▲ 图7. FPSCR寄存器
/ b$ A2 P) D# T; w2 j
" e, o; L* s( k* F8 |; }
执行浮点除0的测试代码:+ R" K; c5 [0 H- [+ G
  1. static volatile float fin = 0.9f,fout,fdiv;( A. i6 B0 U% h
  2. static volatile uint16_t Mark;
    " Q) C, T  n. G7 [$ o! k
  3. /* Div value set to 0 */) o+ A( n2 \: i2 d3 b" m9 Z' E
  4. fdiv = 0.0f;& r* y1 s, h% O3 L1 H1 Y% l
  5. /* Exctue float div 0 */
    0 ]- `) |/ c1 z* V9 K' B! t7 V: O
  6. fout  = fin/fdiv;
    # X) [6 p6 a& i1 _5 O
  7. /* Get wrong mask value */
    7 n4 q) `! P3 w
  8. Mark = __get_FPSCR();
复制代码

! U) [5 ^  i" g: W7 M% @9 g& b& E! U
19.png
▲ 图8. IAR的浮点除0后DZC标志位置位
0 |& Z4 V1 ]7 F6 E' i% y

9 P! t) H" I5 R0 i: f
20.png
▲ 图9. Keil浮点除0后DZC标志位有误

4 k4 k) n! R: o7 U- a" a

# ~, ?! B5 S3 k读取FPSCR寄存器,返回错误码0x02(除0操作)。
1 c0 ?! p6 X, y1 _& I8 z4 j: h- f: c3 D" T
0 [7 i. v8 {# T3 B
21.png
▲ 图10. 读取FPSCR

4 N) e8 s  Y: i, a! `. P4 O8 {5 _
7 P+ @3 |/ L* i/ {% S3 c

% ?# O/ p3 A' M$ j! N/ M0 [
9 R% u' _5 A2 s0 y2 @4 C
4. 结论 ( a; X4 f  l! v
本文通过对除0操作的报错机制做细致说明,可以看到整型除0可以有Hardfault的中断产生,而浮点的除0只能通过标志位判别,实际使用过程中尽量避免这种错误的操作。
6 v5 b+ h" Z% q! f! m  V6 L( r; y, W: j8 T* `
+ u. H7 E9 ?% L' n' Q- i7 D6 ~4 z
▼▼▼
点击按钮下载《Cortex-M核除0操作的报错机制话题》原文档。3 e; I( E4 W! }4 X: _4 u* c
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 手机版