0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

实战经验 | 数据意外变化导致条件判断流程异常

STM32单片机 来源:未知 2023-12-07 10:00 次阅读


关键词:数据意外变化导致条件判断流程异常


目录预览

1、问题描述

2、问题分析

3、小结


01

问题描述


用户使用的 MCU 型号是 STM32H750VB。


在客户的代码中有多个条件语句,在条件里面的变量数值没有变化的情况下执行了条件里面的逻辑。有点类似如下 C 语句 :



即变量 A 在明明没有变化且条件不满足的情况下, 程序运行时偏偏执行了条件内部的代码. 很奇怪的现象。一时很难判断是编译器的问题还是芯片问题.


了解到客户的代码中使用了第三方库, xx.o 文件, 像这样的条件有 80 多个, 每次出现问题的具体变量并不是固定哪一个, 但是在大概 10 分钟内肯定会有其中一个出现执行逻辑问题。随意动一下代码问题就不出现, 或者出现的位置发生变化 ; 用 KEIL 编译器去设置断点, 想看该变量信息, 也会导致问题不再出现。


02

问题分析


一开始查看 errta sheet, 看到以下相关内容 :



即怀疑问题跟 AXI SRAM 相关. 查看客户的这些变量, 确实是存放在 AXI SRAM 中. 由于任何修改代码都可能导致问题不再出现, 因此所有尝试须建立在不修改代码的基础上, 不然无法说明问题。


于是让客户用 STM32CubeProgrammer 以 hot plug 模式连接 MCU, 按照勘误手册中 2.2.9 节所描述的 workaround 方式将 AXI_TARG7_FN_MOD 寄存器的 READ_ISS_OVERRIDE 位通过地址的方式直接修改 :



结果发现并没什么效果. 于是排除了这种可能性.


一开始也怀疑问题可能跟 Cache 有关, 于是测试下关闭 Cahce 会怎么样. 通过 KEIL 调试模式下,暂停住 CPU 运行, 然后手动关闭 D-Cache :



结果发现问题消失不见 ! 说明问题肯定跟 Cache 有关.


但客户的代码最终肯定是不能关闭 Cache 的, 想到内核中有一个寄存器可以打开全局 Cache 的write throght 模式, 如下编程手册中的 CACR 寄存器的 FORCEWT 位 :



结果发现, 客户的代码本身就已经打开 :



看样子此模式与此问题无关. 得换个思路.


考虑到问题跟内存数据有关, 代码又不能动. 但是得想办法让内存中数据的位置动动, 看看会有什么效果 ?


通过修改 KEIL 的链接配置文件.sct 文件, 将变量随意动动, 结果发现问题也会消失不见 ! 这说明,数据的地址跟问题绝对有关联.那么具体是哪些数据呢 ?


为了精确定位到与哪些变量有关, 查看 KEIL 生成的 map 文件, 按地址倒序将每个程序中所用到的.o 的对应变量逐个挪移动 DTCM RAM 中.



为什么要倒序呢? 主要是因为, 假如先挪低地址的变量, 肯定会导致高地址的变量向低地址移动.这好比, 如果先抽掉下面的砖头, 那么上面的砖头会自动移动下面去. 假如先抽掉上面的砖头情况就不一样了, 下面的砖头还会保持不动. 这就是为什么先挪移上面的砖头的意义, 也就是所谓的倒序.


通过这种方式, 最终定位到问题跟 heap_4.o 文件以及用户使用到的第三方提供的 xx.o 文件中的ZI 数据有关. 只要保持这两种数据位置不变, 那么问题就可以稳定触发, 一旦其中任何一个位置有所变动, 问题就消失不见.



现在我们知道规律了, 那么只要固定好这两种 ZI 数据位置不变的情况下, 再去尝试修改代码, 结果发现, 此时修改代码不再会对结果产生影响! 换句话说, 现在可以自由修改代码了.


考虑到此问题与 Cache 有关, 于是接下来通过 MPU 设置将 heap_4.o 所在区域的 Cache 功能关闭, 结果发现问题消失.




Heap_4.o 的 ZI 数据是存放在 SRAM2 中的 0x3002 E050 位置.



现在的现象是,Heap_4.o 的 ZI 数据只需要固定在这个位置, 问题就能稳定重现,只不过将其对应的cache 关闭, 问题则消失.


那么此区域默认的 Cache 属性是怎么样的呢? 这个在 AN4839 中可以找到其默认属性:



于是我们通过代码, 将其 MPU 属性再次配置其默认属性:




结果问题可以重现. 这再次说明, cache 属性对结果有影响.


但是此时还无法对其产生的过程细节进行解释.


与此同时, 尝试关闭客户使用第三方库 xx.o 文件中的数据 cache, 问题也同样会消失。这说明, 此问题跟客户所使用的第三方库是有关系的, 其数据在 cache 中产生了一致性问题.


于是询问客户这个第三方库是如何来的? 他们回复是一家欧洲公司提供的, 且是以 M4 内核编译的.


很明显, 在使用原则上, M4 编译出来的.o 文件, 就不应该用在 H7 工程上.


以 M4 为内核编译的.o 文件放到 M7 工程中会产生什么样的影响? 虽然理论上, M7 内核的指令集是向下兼容的, 但是也需要考虑 M7 内核相关的一些特性, 比如 Cache, memory barrier 等等. 不能完全确保不会出问题, 最保险就是重新以 M7 内核编译这个.o 文件.


由于这个第三方.o 文件客户自己也是无法知道其内部是如何实现的, 因此, 问题的具体产生过程是没办法进一步调查了. 但定位到这个.o 文件已经是当前能得到的最终结果.


03

小结


本文最终问题的真相虽有点匪夷所思, 但这正反映了当前国内软件应用上的混乱情况. 本文所描述的问题根本原因虽然很另类, 但所涉及到的方法却对开发者有一定的参考意义, 在不能动代码的情况下, 需要挪动数据的位置, 这就必须对编译器有一定的了解. 虽也不至于太难, 但对很多开发都来说, 对编译器的了解未必很深, 因此, 一开始很多人就会卡住。另外, 对 MPU 的了解也是一大门槛. 因此, 特奉上此文, 以供参考.


完整内容请点击“阅读原文”下载原文档。


原文标题:实战经验 | 数据意外变化导致条件判断流程异常

文章出处:【微信公众号:STM32单片机】欢迎添加关注!文章转载请注明出处。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6001

    文章

    43978

    浏览量

    620876
  • STM32
    +关注

    关注

    2240

    文章

    10674

    浏览量

    348828

原文标题:实战经验 | 数据意外变化导致条件判断流程异常

文章出处:【微信号:STM32_STM8_MCU,微信公众号:STM32单片机】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    STM32H5 DA证书链实战经验

    之前我们已经讲过了如何通过 DA 认证来回退芯片产品状态,或者重新打开调试口,这样开发人员在芯片为 Closed 状态下时仍可以调试芯片。
    的头像 发表于 03-12 14:08 568次阅读
    STM32H5 DA证书链<b class='flag-5'>实战经验</b>

    XMC1402串口半双工接收异常导致数据丢帧的原因?

    ,如下所示 3异常现象如下 3.1 XMC1402接收到完整数据帧后并未回复,导致数据丢帧,见下图 3.2检查异常接收
    发表于 02-01 08:11

    怎么判断干式变压器噪声异常

    超出了这个范围,就属于异常噪音。本文将介绍如何判断干式变压器噪声异常。 第一步:了解正常范围 首先,我们需要了解干式变压器的正常噪音范围。根据经验,通常情况下,干式变压器的噪音应该在4
    的头像 发表于 01-26 16:06 396次阅读

    服务器断电导致raid模块损坏的数据恢复案例

    情况,北亚企安数据恢复工程师初步判断服务器故障原因是意外断电导致的raid模块损坏,经过详细检测发现是异常断电
    的头像 发表于 12-25 14:29 225次阅读

    javaweb从入门到实战

    的学习和实践。本文将为大家详述JavaWeb的入门以及实战经验,希望能帮助到正在追求JavaWeb技术的开发者。 入门 1.1 Java基础知识 在学习JavaWeb之前,首先要掌握Java语言的基础知识,包括面向对象的概念、类与对象、继承与多态、异常处理等。理解这些基础
    的头像 发表于 12-03 11:44 899次阅读

    变压器的温度变化如何判断

    变压器的温度变化如何判断? 变压器是一种将电能转化为不同电压的电力设备,广泛应用于电力系统中。由于运行期间会产生大量的热量,其温度的变化对其性能和寿命有着重要影响。因此,了解变压器的温度变化
    的头像 发表于 11-23 15:49 722次阅读

    sql怎么在where条件判断

    在SQL中,WHERE条件用于筛选符合特定条件的记录。它提供了一种在查询中过滤数据的方法,使您能够根据所需的特定条件对查询结果进行更精确的控制。 在WHERE子句中,您可以使用各种操作
    的头像 发表于 11-23 11:30 851次阅读

    python if 多条件并列判断

    Python中的if语句允许我们根据条件执行不同的代码块。有时候我们需要同时判断多个条件是否满足,并根据结果执行不同的代码块。在这篇文章中,我们将会进行详尽、详实且细致的介绍。 首先,我们来看
    的头像 发表于 11-21 16:40 615次阅读

    华秋这场技术研讨邀请了哪些重磅嘉宾

    运作流程,精通SMT生产设备及工艺流程,熟练掌握各工序制程及全制程工艺要求,对SMT异常分析,及不良问题改良具备成熟实战经验。 参会福利 路线指引小贴示 自驾:导航定位至新一代产业园
    发表于 11-17 14:42

    华秋这场技术研讨邀请了哪些重磅嘉宾?

    运作流程,精通SMT生产设备及工艺流程,熟练掌握各工序制程及全制程工艺要求,对SMT异常分析,及不良问题改良具备成熟实战经验。 参会福利 路线指引小贴示 自驾:导航定位至新一代产业园
    发表于 11-17 14:40

    PLC现场安装、调试全流程实战经验

    深入了解设计资料、对系统工艺流程,特别是工艺对各生产设备的控制要求要有全面的了解,在此基础上,按子系统绘制工艺流。程联锁图、系统功能图、系统运行逻辑框图、这将有助于对系统运行逻辑的深刻理解,是前期技术准备的重要环节。
    的头像 发表于 11-14 16:38 518次阅读

    实战经验 | TrustZone 架构下 LPBAM 使用导致的 HardFault

    从 bootloader 跳转到app。在之前版本都是正常跳转的,某一天 IAR 从 9.20 升级到 9.30 后,程序跳转失败,并且会导致 hardfault,想知道为什么会失败。 图1.IAR9.20
    的头像 发表于 10-20 15:05 295次阅读
    <b class='flag-5'>实战经验</b> | TrustZone 架构下 LPBAM 使用<b class='flag-5'>导致</b>的 HardFault

    一文详解python条件判断

    今天给大家带来python条件判断
    发表于 10-01 10:48 438次阅读

    如何判断变压器的故障

    电力变压器出现故障时,一般情况下外观体表会发生变化,有时还会发出异常的气味。从事电气维护保运工作多年的老电工,一般都遇到过各种各样的变压器故障,所以有经验的老电工根据这些外观异常,便可
    的头像 发表于 09-21 11:15 1169次阅读

    Top和Block实战经验以及DDR接口时序

    IO约束在顶层和模块级的主要命令都是以下几个,但是实际应用的复杂程度不可同日而语,本篇会先介绍模块级IO约束实战经验,然后讲解顶层IO约束复杂性,过程中会介绍DDR接口时序。
    的头像 发表于 06-27 15:07 596次阅读
    Top和Block<b class='flag-5'>实战经验</b>以及DDR接口时序