flash读写导致死机问题分析
2021/6/2 18:52:21
本文主要是介绍flash读写导致死机问题分析,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
有个项目需要将原NXP1766芯片移植到国民N32芯片中,但是移植过程会出现死机现象。记录下分析过程。
1、现象分析
当PC发送通信申请命令后,STM32动态申请内存空间存储数据并进行处理:
当出现死机现象时,Mem_com_rx单向链表显示可用空间为0:
单步调试发现程序还能运行,没有报出错误,但是不能进入主任务喂狗,并且发现频繁进入flash读写函数:
查看保存参数函数,函数本身逻辑没有问题,参照国民给的例程擦写,写的时候数据长度为0x18,远远小于分配的空间。当前参数值为:
通过查看内存值,发现参数值正确,没有被误写入。
查看内存地址,程序中需要向两个内存地址中写数据,分别是0x08071000(存储boot烧写状态参数)和0x08073000(主程序运行参数)。查看内存空间值发现:
0x08071000地址参数正常,但是0x08073000这个地址参数全部被清除,没有值。正常情况如下:
分析该情况为当程序保存参数时,需要擦除flash再写入,当擦除后,还没有写入,就被别的中断给打断,导致参数不正常,后续串口处理部分需要判断参数值再去处理,读出的参数值为空,则不去释放内存块,导致死机。
2、解决方案
读写flash代码为官方给的例程函数,但经过分析,操作代码前没有进行关中断操作,这是比较严重的BUG,因为操作flash是原子操作,所以需要关闭中断,防止被打断。
进行上面操作以为问题已经解决,但是烤机发现还是会出现死机。经过与厂家沟通,发现有两个问题:
- Flash读写有使用寿命,一般为10万次左右,如果主程序频繁读写,会造成坏块出现;
- 写flash的时间比较长,一般为毫秒量级,而且还需要关闭中断,所以会导致串口中断无法产生,会出现数据丢失现象;
最终解决办法为将存储数据放到外部flash中,完美解决问题。
Flash问题的文章:https://blog.csdn.net/ybhuangfugui/article/details/99827002
这篇关于flash读写导致死机问题分析的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-27OpenFeign服务间调用学习入门
- 2024-12-27OpenFeign服务间调用学习入门
- 2024-12-27OpenFeign学习入门:轻松掌握微服务通信
- 2024-12-27OpenFeign学习入门:轻松掌握微服务间的HTTP请求
- 2024-12-27JDK17新特性学习入门:简洁教程带你轻松上手
- 2024-12-27JMeter传递token学习入门教程
- 2024-12-27JMeter压测学习入门指南
- 2024-12-27JWT单点登录学习入门指南
- 2024-12-27JWT单点登录原理学习入门
- 2024-12-27JWT单点登录原理学习入门