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单片机】欢迎添加关注!文章转载请注明出处。

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

    关注

    6032

    文章

    44513

    浏览量

    632691
  • STM32
    +关注

    关注

    2265

    文章

    10870

    浏览量

    354692

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

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

收藏 人收藏

    评论

    相关推荐

    技术干货驿站 ▏深入理解C语言:掌握C语言条件判断,从if到switch的应用

    在编程中,条件判断语句是控制程序流程的核心元素之一。它们使得程序能够根据不同的输入和状态,做出相应的决策。特别是在C语言中,条件判断语句的使
    的头像 发表于 11-09 01:10 154次阅读
    技术干货驿站 ▏深入理解C语言:掌握C语言<b class='flag-5'>条件</b><b class='flag-5'>判断</b>,从if到switch的应用

    TI电量计通讯异常的分析经验

    电子发烧友网站提供《TI电量计通讯异常的分析经验.pdf》资料免费下载
    发表于 08-23 10:12 0次下载
    TI电量计通讯<b class='flag-5'>异常</b>的分析<b class='flag-5'>经验</b>

    plc突然断电会导致什么异常

    PLC(Programmable Logic Controller,可编程逻辑控制器)是一种广泛应用于工业自动化领域的控制器。当PLC突然断电时,可能会导致一些异常情况,这些异常情况可能
    的头像 发表于 07-25 10:11 1127次阅读

    服务器数据恢复—异常断电导致RAID信息丢失的数据恢复案例

    意外断电导致raid硬件损坏或者riad管理信息丢失等raid模块损坏而导致数据丢失的情况非常普遍。正常情况下,磁盘阵列一旦创建完成就不会再对管理模块中的信息进行更改,但是raid管理
    的头像 发表于 07-01 11:21 286次阅读

    HarmonyOS实战开发-合理选择条件渲染和显隐控制

    。 反例 没有使用容器限制条件渲染组件的刷新范围,导致条件变化会触发创建和销毁该组件,影响该容器内所有组件都会刷新。 @Entry @Component struct
    发表于 05-10 15:16

    服务器数据恢复—异常断电导致RAID管理信息丢失的数据恢复案例

    使用。 服务器故障: 机房供电几次意外中断,服务器出现故障前最后一次异常断电重启后RAID报错,提示无法找到存储设备,进入RAID管理模块做任何操作都死机,重启服务器后问题依旧,用户联系北亚企安数据恢复中心寻求帮助。
    的头像 发表于 04-30 15:34 322次阅读

    lc振荡电路判断是否起振的相位条件是什么

    起振条件是指一个电路能够在没有任何外部干扰的情况下,自发地产生振荡信号的条件。对于LC振荡电路,起振条件是通过判断电路在稳定状态下的相位关系来决定是否起振。 LC振荡电路是由一个电感(
    的头像 发表于 03-01 11:23 2494次阅读

    服务器数据恢复-异常断电导致服务器故障的数据恢复案例

    服务器数据恢复环境: dell某型号服务器中有一组通过raid卡组建的raid10,该raid阵列中一共有4块磁盘。上层部署XenServer虚拟化平台,作为网站服务器使用。 服务器故障: 服务器异常断电导致服务器上的一台
    的头像 发表于 02-28 15:15 791次阅读
    服务器<b class='flag-5'>数据</b>恢复-<b class='flag-5'>异常</b>断电<b class='flag-5'>导致</b>服务器故障的<b class='flag-5'>数据</b>恢复案例

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

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

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

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

    实战经验 | 如何在用户应用中开启 LoRa CAD

    SubGHz_Phy_Per 中开启 CAD 4、小结 01 LoRa CAD 应用场景举例 在 STM32WL LoRa 某些应用中,尤其是电池供电的设备上,需要按需发送数据,如下发指令,让
    的头像 发表于 12-26 17:45 1419次阅读
    <b class='flag-5'>实战经验</b> | 如何在用户应用中开启 LoRa CAD

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

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

    燃油系统压力异常导致什么故障现象

    燃油系统压力异常可能导致多种问题和故障,因为正常的燃油压力对引擎性能至关重要。
    的头像 发表于 12-12 11:15 751次阅读
    燃油系统压力<b class='flag-5'>异常</b>会<b class='flag-5'>导致</b>什么故障现象

    javaweb从入门到实战

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

    sql怎么在where条件判断

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