А что вам мешает защищать ваши ячейки контрольной суммой? Например так:
CODE
#include "crc.h"
#include "eeprom.h"
//******************************************************************************
// Функция сохраняет данные в еепром с добавлением 2 байт CRC
//******************************************************************************
bool SaveBlock(unsigned short Address, char* Data, unsigned short Size)
{
char Ch;
unsigned short Crc = 0xFFFF;
for (unsigned short Index = 0; Index < Size; Index++)
{
Ch = Data[Index];
__EEPUT(Address + Index, Ch);
Crc = AddCrc16(Ch, Crc);
}
__EEPUT(Address + Size, (unsigned char)Crc);
__EEPUT(Address + Size + 1, (unsigned char)(Crc >> 8));
return true;
}
//******************************************************************************
// Функция читает данные из еепром с контролем 2 байт CRC
//******************************************************************************
bool LoadBlock(unsigned short Address, char* Data, unsigned short Size)
{
char Ch;
unsigned short Crc = 0xFFFF;
for (unsigned short Index = 0; Index < Size; Index++)
{
__EEGET(Ch, Address + Index);
Data[Index] = Ch;
Crc = AddCrc16(Ch, Crc);
}
__EEGET(Ch, Address + Size);
Crc = AddCrc16(Ch, Crc);
__EEGET(Ch, Address + Size + 1);
Crc = AddCrc16(Ch, Crc);
return Crc ? false : true;
}
xSemaphoreHandle EepromLockMutex = NULL;
//******************************************************************************
// Заблокировать интерфейс
//******************************************************************************
void EepromLock()
{
portENTER_CRITICAL();
if(EepromLockMutex == NULL) EepromLockMutex = xSemaphoreCreateMutex();
portEXIT_CRITICAL();
xSemaphoreTake(EepromLockMutex, portMAX_DELAY);
}
//******************************************************************************
// Разблокировать интерфейс
//******************************************************************************
void EepromUnlock()
{
xSemaphoreGive(EepromLockMutex);
}
//******************************************************************************
// Функция загружает конфигурацию из EEPROM в случае успеха возвращает true
//******************************************************************************
bool EepromLoadConfig(USHORT Offset, void* Config, unsigned short Size)
{
bool Ret = true;
Offset = (Offset + 2) * 2;
EepromLock();
if (!LoadBlock(Offset + 0, Config, Size))
if (!LoadBlock(Offset + Size + 2, Config, Size))
Ret = false;
EepromUnlock();
return Ret;
}
//******************************************************************************
// Функция сохраняет конфигурацию в EEPROM в случае успеха возвращает true
//******************************************************************************
bool EepromSaveConfig(USHORT Offset, void* Config, unsigned short Size)
{
Offset = (Offset + 2) * 2;
EepromLock();
SaveBlock(Offset + 0, Config, Size);
SaveBlock(Offset + Size + 2, Config, Size);
EepromUnlock();
return true;
}
Функции EepromLock/EepromUnlock и расчет смещения для нескольких записей можно удалить. Функцию для расчета crc добавить по вкусу.
Сообщение отредактировал IgorKossak - Feb 27 2012, 14:37
Причина редактирования: [codebox]