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是原子操作,所以需要关闭中断,防止被打断。

       进行上面操作以为问题已经解决,但是烤机发现还是会出现死机。经过与厂家沟通,发现有两个问题:

  1. Flash读写有使用寿命,一般为10万次左右,如果主程序频繁读写,会造成坏块出现;
  2. 写flash的时间比较长,一般为毫秒量级,而且还需要关闭中断,所以会导致串口中断无法产生,会出现数据丢失现象;

最终解决办法为将存储数据放到外部flash中,完美解决问题。

Flash问题的文章:https://blog.csdn.net/ybhuangfugui/article/details/99827002



这篇关于flash读写导致死机问题分析的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程