本文的目的是提供一种软件方法,解释如何处理存储在非易失性设备(例如小型 EEPROM 或闪存)中的内存数据集损坏。在微型嵌入式系统中看到这些数据集是很常见的,这些系统存储了配置参数、关键系统日志等持久数据。这些数据集可能会在系统崩溃、电源故障或 ESD 后损坏。
本文提出了一种简单但有效的机制,可以以较低的损坏可能性保存此类数据。此外,该方法包括一个众所周知的机制来检测变量损坏,因为它们可能被各种原因损坏,例如环境因素(例如,EMI、热量、辐射)、硬件故障(例如,电源波动、电源故障、存储器单元故障、地址线短路)或软件故障(其他软件错误地修改存储器)。尽管本文使用 C 语言来实现所提出的方法,但它也可以很容易地用其他编程语言(如 C++)来实现。
假设一个嵌入式系统可以在运行时通过一组存储在非易失性存储器中的参数进行配置。这些参数排列在一个 C 结构中:
typedef struct ConfigData ConfigData ;
结构体配置数据
{
int optionA;
多头选项B;
};
如果在更新这些数据时发生电源故障或系统重置会发生什么?它们可能已损坏。为了解决这个问题,在配置数据上计算了一个称为CRC值的固定长度的二进制代码,以检测它们是否已损坏。除了数据值外,此代码还存储在非易失性存储器中:
typedef struct Config配置;
结构体配置
{
配置数据数据;
crc32 crc;
};
假设实现此方法的软件模块称为Config,它提供初始化、设置和获取配置数据的功能,同时通过调用 CRC 计算器来保护它们。这些函数在名为Config.h的头文件中定义,并在名为Config.c的源文件中实现。以下代码片段显示了文件Config.h 的一个片段。
typedef enum ConfigErrorCode ConfigErrorCode;
枚举配置错误代码
{
NO_ERRORS,
INIT_DATA,
CORRUPT_DATA
};
...
typedef void (*ConfigErrorHandler)(ConfigErrorCode errorCode);
...
ConfigErrorCode Config_init ( void );
void Config_setErrorHandler (ConfigErrorHandler errorHandler);
bool Config_getOptionA