Цитата(zombi @ Mar 1 2011, 17:01)

Если просто хранить номер записи то младший бит будет меняться с каждым увеличением.
Во-первых вы немного ошибаетесь - можно подобрать количество записей так, что изменения в младшем бите будут очень редкими.
Например, если записи всего две, то младший бит в sequence ячейках практически никогда меняться не будет, т.к. в 0-ю запись попадут все четные sequence, в 1-ю - все нечетные.
Во-вторых - даже если младший бит будет меняться постоянно, ну и что? Мы же пишем всегда в новые n-байт, т.е. ячеек с sequence'ом будет столько же сколько и записей, наработка на отказ - все те же n * 100000, где n - размерность массива записей.
Ниже пример реализации алгоритма, правда здесь в качестве хранилища используется флеш (проц SAM7):
Код
void js_LoadConfig(void)
{
U8 *p = (U8 *)(CONFIG_START_FLASH_ADDRESS);
U8 last_seq = *p;
U8 *pLastConfig = p;
U8 buf[sizeof(jsContext.Cfg)];
PJS_CONFIG pCfg = (PJS_CONFIG)buf;
int i;
for (i = 0; i < CONFIG_MIRROR_PAGE_COUNT; i++)
{
p += FLASH_PAGE_SIZE_BYTES;
if (((U8)(last_seq + 1)) == *p)
{
last_seq = *p;
pLastConfig = p;
}
else
{
p = pLastConfig;
break;
}
}
// at this point p - points to the address with the most fresh config record
memcpy( buf, p, sizeof(buf));
jsContext.LastLocation = (U32)p;
jsContext.Cfg.Sequence = *p;
// check CRC of the record
if ( CRC16( buf, sizeof(buf) != 0 )
{
printf("CRC error exp=%2x, cur=%2x, flash_addr=%x, seq=%d\n", hCRC, pCfg->CRC, (U32)p, *p);
printf("The configuration has NOT been applied!\n" );
printf("or there is no previously saved configuration.\n");
// store defaults
js_StoreConfig();
}
else
{
// CRC is ok, applying new settings
memcpy( &jsContext.Cfg, pCfg, sizeof(jsContext.Cfg));
printf("Configuration applied, seq_%x\n", *p);
}
}
void js_StoreConfig(void)
{
jsContext.Cfg.Sequence += 1;
jsContext.LastLocation += FLASH_PAGE_SIZE_BYTES;
if (jsContext.LastLocation > CONFIG_LAST_FLASH_CELL_ADDRESS)
jsContext.LastLocation = CONFIG_START_FLASH_ADDRESS;
jsContext.Cfg.CRC = CRC16( (U8 *)&jsContext.Cfg, sizeof(jsContext.Cfg) - 2);
iap_PageWrite( jsContext.LastLocation, (U32 *)&jsContext.Cfg, sizeof(jsContext.Cfg) );
printf("configuration stored, L(%x), Sq(%x), (%d)bytes\n", jsContext.LastLocation, jsContext.Cfg.Sequence, sizeof(jsContext.Cfg));
}
CONFIG_MIRROR_PAGE_COUNT --> это число записей в массиве.
Sequence постоянно увеличивается, и новый sequence пишется уже в новую запись. При загрузке конфигурации - пробегаемся по массиву, находим самую страшую запись и берем ее.
2 moderator: просьба тэг [ code ] на [ codebox ] не менять, пасиба.