配置信息丢失问题调试及解决方法

来源:互联网 发布:中国电信网络测速工具 编辑:程序博客网 时间:2024/05/12 07:42

我参加 了CSDN2014 博客之星大赛,请大家多多支持(每天都可以投一票哦)。

http://vote.blog.csdn.net/blogstar2014/details?username=woshi_ziyu#content

————————————————————————————————————

现象:

采集计算器长期运行一段时间后,配置信息丢失,通断控制器的ID为0xFFFFFFFF,所以报上传故障。

 

解决方法:

查看串口调试软件的监控记录,使用0xFFFFFFFF查找第一次出现的地方并定位上下电时间上传记录,如下图所示:

通过查看记录得到以下信息:

1.首次发生的时间点为2015-01-0315:15:06

2.发生的故障点位于上下电记录上传

3.发生故障后保存的数据没有发生变化,即EEPROM中存储的数据为故障发生时的数据。

4.该记录21个字节中有4个字节正确(02 0002 42),17个数据错误(全部显示为0xFF,即无数据);

 

使用采集计算器的导出功能,查看上下电时间记录的数据:


从图上得知:

PowerOnOffDataCounter. Erased =0x00000110(272);

PowerOnOffDataCounter.storage=0x0000C30D(49933);

PowerOnOffDataCounter. upload=0x0000C30D(49933);

PowerOnOffDataCounter. ex_out=0x0000C30D(49933);

上下电记录分配的内存空间:

(0x00F0 0000~0x013F FFFF)1280个扇区数,共计5M Byte;

每个上下电记录数据的占据的空间大小为0x15(21个字节)

擦除空间为

0x00F0 0000 / 1000 + 0x110 = 0x1010(0x1010 -0x101F)

擦除地址:0x00101 000 - 0x0010 100F

存储空间地址:

0x00F0 0000 + 0x010 0011(1048593) = 0x01000011

 

根据以上信息绘制当前记录的内存分布:

 

0x00

0x01

0x02

0x03

0x04

0x05

0x06

0x07

0x08

0x09

0x0A

0x0B

0x0C

0x0D

0x0E

0x0F

0x00FF FFF0

上一条记录

本次记录

0x0100 0000

本次记录

0x0100 0010

本次记录

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

从表中可以看出本次记录分布在0x0100 0000地址空间,且正好位于BLOCK与BLOCK之间,所以初步断定和写数据有关。

 

根据以上推论进行测试;

测试方法是:在该内存地址直接写入数据,看是否影响配置信息;

代码如下:


运行代码,进行调试,调试结果如下:


写入前配置信息正确。


写入后配置信息丢失。

 

经调试代码发现驱动中擦除函数有些BUG:

该驱动函数中,擦除指令给出的地址为3个字节,当前擦除地址超出了3个字节,忽略高8位,及0x01000000编程了0x0000000,即配置信息所分配的内存空间。

 

解决方法:

将驱动中的擦除函数的地址改成4个字节,经调试,配置信息不再丢失。

0 0
原创粉丝点击