当前位置: 首页 > news >正文

读取了错误数据导致STM32 单片机Hard Fault

RT,程序本来能运行,然后代码几乎没改,突然就卡死在Hard Fault 里了。 用调试器跟踪了半天,发现是在调用屏幕库函数显示某个字符串时挂掉的。

第一步怀疑是指针指向的地址没有对齐,导致Hard Fault,于是来回试,更改字符串的定义方式,无果,开始怀疑是不是掉进编译的坑里了,或者是屏幕库有BUG。

第二步,程序启动时把要显示的指针数值从串口打印出去,发现无论我怎么改字符串定义,指针指向的地址始终不变。

第三步,突然想起来,这个指针的值会保存到Flash 里,复位后加载,所以值才一直不变。

所以问题就是之前的程序存储的数据有误,或者之前程序里指针指向的字符串地址在重新编译后发生变化,导致用读取出来旧的指针地址无法取得有效数据,结果可能是Hard Fault,也可能是显示出乱码。

解决方案是尽量不把指针直接存下来,可以把要指向的所有字符串或其他对象先放到一个数组里,然后存储数组下标,这样就算下标发生错误,也很容易检查出来,不会触发Hard Fault,让人一头雾水。

而对于我的代码,要存储的东西实际是一个结构体数组,结构体里面又放了指针,就算不把指针存进Flash,要是结构体数组的定义有点改变,读取的旧数据也是无效的,跟新的定义对不上了。需要个办法让程序在Flash 数据失效后不读取数据:

  1. 固件里硬编码个版本号,Flash 里也存储个版本号。数据定义变更后,手动改变固件里的版本号,于是旧的Flash 数据就可以被识别出来;
  2. 计算出默认状态结构体数组的CRC 校验码,并存储到Flash 中。变更定义后,校验码相应的会改变,就能自动识别出失效的Flash 数据;
  3. 每次烧录程序后把存储的数据清空;

我选了方案一,简单,不会出意外。

http://www.dtcms.com/a/319681.html

相关文章:

  • 智能升级革命:Deepoc具身模型开发板如何让传统除草机器人拥有“认知大脑”
  • 分布式微服务--GateWay(过滤器及使用Gateway注意点)
  • 翻译模型(TM):基于短语的统计翻译模型(PBSMT)的构建
  • C++语法与面向对象特性(2)
  • PyTorch如何实现婴儿哭声检测和识别
  • 目标检测数据集 - 自动驾驶场景道路异常检测数据集下载「包含VOC、COCO、YOLO三种格式」
  • 接口自动化-pytest
  • OpenAI 开源模型 gpt-oss 正式上线微软 Foundry 平台
  • 网络可视,运维无忧:分钟级定位,告别盲目扩容
  • 从零开始构建情绪可视化日记平台 - React + TypeScript + Vite
  • CPTS Remote 复现
  • Redisson中的分布式锁
  • 自动化办公革命:3小时完成8小时工作量
  • 钢卷矫平机科普:把“弯曲的记忆”清零
  • 人工智能与能源:AI 驱动的能源产业变革
  • MCU-基于TC397的双BootLoader设计方案
  • 关于vue2中对接海康摄像头以及直播流rtsp或rtmp,后台ffmpeg转码后通过ws实现
  • 【linux】vmware中ubuntu无法上网
  • 关于 cadence导入原理图出现ERROR(ORCAP-1192)错误 的解决方法
  • 蓝桥杯算法之搜索章 - 3
  • HarmonyOS分布式开发实战:打造跨设备协同应用
  • C 语言主控开发与显控开发能力体系及技术栈详解,STM32、QT、嵌入式、边缘系统显示
  • 【Vite】Vite 构建 React 项目中 Select a variant 配置选择指南:标准版 vs SWC
  • shell脚本while只循环一次,后续循环失效
  • 解码算法:维特比算法(Viterbi)在SMT中的应用
  • 开发避坑指南(20) :MyBatis操作Oracle插入NULL值异常“无效列类型1111“解决方案
  • 金仓KingbaseES逻辑架构,与Oracle/MySQL对比
  • Windows Oracle 11 g dmp数据库恢复笔记
  • 一种基于CEEMDAN-小波阈值联合降噪-快速谱峭度(FSK)/基尼谱Ginigram/Autogram的故障诊断 Matlab
  • 【已解决】-bash: mvn: command not found