在读取之前检测结构中的数据是否已损坏

时间:2016-01-28 12:01:40

标签: c struct embedded corruption

有人告诉我,嵌入式c中有一些技术可以检查您的数据是否已损坏。我更感兴趣的是检测我的数据是否因为某些其他进程损坏RAM内存而被破坏。

我试图在互联网上找到一些信息,但我找不到任何东西。

一种方法是使用边界值“围绕”结构的成员,在阅读这些成员之前,检查这些值是否仍然是预期值:

#define BOUNDARY_VALUE 0xDEADBEEF

typedef struct
{
    uint32_t top_boundary;
    int32_t some_data[4];
    uint32_t bottom_boundary;
} tMyDummyStruct;

tMyDummyStruct GetSomeData( void )
{
    return (tMyDummyStruct){
        .top_boundary = BOUNDARY_VALUE,
        .some_data = {1, 2, 3, 4},
        .bottom_boundary = BOUNDARY_VALUE,
    };
}

bool IsDataCorrupted( tMyDummyStruct* data_struct )
{
    if( data_struct->top_boundary == BOUNDARY_VALUE &&
        data_struct->bottom_boundary == BOUNDARY_VALUE)
    {
        return false;
    }
    return true;
}

另一种技术是在结构中创建一个crc成员,并在每次读/写时检查/更新它:

typedef struct
{
    int32_t some_data[4];
    uint32_t crc;
} tMyDummyStruct;

uint32_t GetCrcOf( int32_t[] );

tMyDummyStruct GetSomeData( void )
{
    tMyDummyStruct retval = {
        .some_data = {1, 2, 3, 4},
        .crc = 0,
    };
    retval.crc = GetCrcOf(retval.some_data);
    return retval;
}

bool IsDataCorrupted( tMyDummyStruct* data_struct )
{
    if( data_struct->crc == GetCrcOf( data_struct->some_data ) )
    {
        return false;
    }
    return true;
}

我的问题是:你知道更多技巧还是更好的技巧?是否有记录这些技术的地方?

由于

1 个答案:

答案 0 :(得分:1)

这取决于您想要检测哪种类型的损坏以及您愿意在内存和运行时方面支付哪些惩罚来检测它。这是一种权衡。

一个简单的方案将是你在第一个例子中建议的边界方案。这将检测行或页中的所有字节是否已损坏,但不会检测单个位错误。

稍微复杂的方案是在数据末尾存储奇偶校验字节。通过对结构中的所有字节进行异或运算来计算此奇偶校验。这将检测数据中的单个位错误,但不会检测到两位错误。这不会有太多的运行时间。

在复杂程度上,您还有 CRC代码。这可以是16位或32位,并且可以检测数据中的多个位错误。阅读汉明距离以获取有关可纠正的位错误数量的更多信息。

然后有纠错码。这些代码可以检测多位错误,并且还可以纠正单个或有时两个位错误。这些用于容错微处理器。