保护您的嵌入式软件免受内存损坏

本文的目的是提供一种软件方法,解释如何处理存储在非易失性设备(例如小型 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
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值