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

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

    关注

    6078

    文章

    45636

    浏览量

    675899
  • STM32
    +关注

    关注

    2314

    文章

    11214

    浏览量

    375432

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

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

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    经验贴 8:AP4054 芯片介绍 + 高温环境降额使用与热稳定性经验

    自带热保护,但 高温环境下不建议长期满负荷 500mA 运行 。在密闭外壳、户外高温、散热条件差的场景中,满负荷工作会让芯片持续高温,虽不会立即损坏,但会加速老化并影响充电效率。我的实战经验是:高温
    发表于 04-21 09:00

    【CANopen实战】如何实现PDO数据变化即刻发送(事件触发模式详解)

    【CANopen实战】如何实现PDO数据变化即刻发送(事件触发模式详解)
    的头像 发表于 04-09 14:39 290次阅读
    【CANopen<b class='flag-5'>实战</b>】如何实现PDO<b class='flag-5'>数据</b><b class='flag-5'>变化</b>即刻发送(事件触发模式详解)

    GPS时钟授时装置常见问题与实战经验分享

    作为一名长期关注时间同步技术的网络宣传人员,我经常收到用户关于GPS时钟授时装置的各种咨询。从电力变电站到5G网络机房,从自动驾驶测试场到金融数据中心,这些设备默默守护着现代社会的精密运转。今天,我想结合行业内的技术发展和实际应用中的经验,和大家聊聊GPS时钟授时装置那些
    的头像 发表于 03-06 11:03 305次阅读
    GPS时钟授时装置常见问题与<b class='flag-5'>实战经验</b>分享

    1688 商品详情 API 调用与数据解析 Python 实战

    你想要的是 1688 商品详情 API 的 Python 调用与数据解析实战方案,核心是完成 API 凭证配置、接口请求(含签名)、响应数据解析、异常处理 的全
    的头像 发表于 02-10 11:23 529次阅读

    RK806中断处理流程深度解析:从架构到调试实战

    RK806 作为瑞芯微主流 PMIC(电源管理芯片),其中断机制是实现“电源键响应、电压异常保护、休眠唤醒、 watchdog 超时处理” 等核心功能的基础。Linux 驱动基于regmap_irq框架设计,屏蔽了底层寄存器操作细节,但调试时若不理解中断流程,往往会陷入“
    的头像 发表于 02-05 13:46 2988次阅读
    RK806中断处理<b class='flag-5'>流程</b>深度解析:从架构到调试<b class='flag-5'>实战</b>

    雪深数据精准采集:激光传感器抗干扰技术实战指南

    。本文结合实战经验,拆解激光雪深传感器的抗干扰技术细节与实操要点,助力搭建稳定可靠的监测系统。 一、雪天激光传感器核心干扰源解析 1. 光学类干扰 自然强光(阳光直射、雪地反射)会淹没激光回波信号,导致接收端信噪比
    的头像 发表于 02-02 14:45 388次阅读

    无线倾角传感器在房屋监测中的应用:用数据替代经验判断

    直川科技无线倾角传感器精度达±0.005°,可连续监测房屋毫米级倾斜趋势,弥补人工巡检盲区。在江苏昆山紫竹公寓项目中,成功识别无外观异常的结构变化,实现早期预警。设备IP67防护,3–5年免维护,推动房屋安全从经验
    的头像 发表于 01-20 13:48 886次阅读
    无线倾角传感器在房屋监测中的应用:用<b class='flag-5'>数据</b>替代<b class='flag-5'>经验</b><b class='flag-5'>判断</b>

    车载音频功放芯片实战经验与深度疑问

    中,因未考虑老旧车型电源纹波问题,CD7388 工作时出现间歇性杂音,加装二级滤波电路后,杂音完全消除,连续工作 3 个月无异常。 3. 故障排查与快速定位经验 在 CD7377CZ 与 CD7388
    发表于 12-05 09:53

    UART、SPI、I2C 实战对比:哪个更适合你的项目?

    在嵌入式开发中,设备之间的通信是绕不开的话题。常见的三种总线接口——UART、SPI、I2C——各有优缺点。不同项目需求决定了选择哪一种协议最合适。本文结合实战经验,逐项对比三者,并附带实战代码
    的头像 发表于 11-24 19:04 1806次阅读
    UART、SPI、I2C <b class='flag-5'>实战</b>对比:哪个更适合你的项目?

    怎么判断土压力计数据正常还是异常?

    土压力计数据的正常与异常工作性态是怎样的?通过对大量监测数据的分析总结,可识别出土压力计的正常和异常工作模式,这为判断仪器工作状态和评估工程
    的头像 发表于 10-31 14:43 389次阅读
    怎么<b class='flag-5'>判断</b>土压力计<b class='flag-5'>数据</b>正常还是<b class='flag-5'>异常</b>?

    如何使用数据异常判断电能质量在线监测装置采样电阻是否损坏?

    通过数据异常判断电能质量在线监测装置采样电阻是否损坏,核心是聚焦电流测量数据异常特征—— 采样电阻负责将电流信号转为电压信号,其损坏(开路
    的头像 发表于 10-22 14:32 1221次阅读

    数据库慢查询分析与SQL优化实战技巧

    今天,我将分享我在处理数千次数据库性能问题中积累的实战经验,帮助你系统掌握慢查询分析与SQL优化的核心技巧。无论你是刚入门的运维新手,还是有一定经验的工程师,这篇文章都将为你提供实用的解决方案。
    的头像 发表于 09-08 09:34 1370次阅读

    Linux服务器性能调优的核心技巧和实战经验

    如果你正在为这些问题头疼,那么这篇文章就是为你准备的!作为一名拥有10年经验的运维工程师,我将毫无保留地分享Linux服务器性能调优的核心技巧和实战经验
    的头像 发表于 08-27 14:36 1307次阅读

    碳化硅衬底 TTV 厚度测量数据异常的快速诊断与处理流程

    摘要 本文针对碳化硅衬底 TTV 厚度测量中出现的数据异常问题,系统分析异常类型与成因,构建科学高效的快速诊断流程,并提出针对性处理方法,旨在提升
    的头像 发表于 08-14 13:29 1476次阅读
    碳化硅衬底 TTV 厚度测量<b class='flag-5'>数据</b><b class='flag-5'>异常</b>的快速诊断与处理<b class='flag-5'>流程</b>

    判断伺服行星减速机出现噪音的异常

    伺服行星减速机出现噪音通常被视为一种异常现象,这种噪音可能会影响设备的正常运行,甚至对工作环境和操作人员的健康造成不良影响。以下是对伺服行星减速机出现噪音异常判断及可能原因的分析: 一、判断
    的头像 发表于 07-31 18:16 1310次阅读
    <b class='flag-5'>判断</b>伺服行星减速机出现噪音的<b class='flag-5'>异常</b>