реклама на сайте
подробности

 
 
> Энергонезависимая Память AVR
Br.Misha
сообщение Feb 27 2011, 12:27
Сообщение #1


Местный
***

Группа: Validating
Сообщений: 253
Регистрация: 21-12-08
Пользователь №: 42 646



Привет!
В ДШ на атмегу написано, что еепром можно перезаписывать 100000 раз. Это касается каждой ячейки отдельно или нет?
Почему спрашиваю? Просто хочу сделать девайс, который будет работать много лет и много раз будет перезаписана. У атмеги8 512 байт, всего мне нужно около 15 байт. Принцип такой: 16 байт используются для хранения даных и 4 байта для хранения счетчика записей. После каждой записи я буду увеличивать счетчик на 1 и когда дойдет до 100000, то буду записывать даные и счетчик в следующие 20 байт, получается, циклов записи будет около 2 милионов (для атмега8). Как вам идея?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
defunct
сообщение Mar 1 2011, 12:54
Сообщение #2


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(Br.Misha @ Feb 27 2011, 14:27) *
Как вам идея?

Лучше не ждать когда накрутит 100000, а просто каждую запись писать в следующие n-байт. Напр сделать массив из 20-ти записей по 16 байт, писать вначале 0-ю запись, потом 1-ю ..... 19-ю, опять 0-ю и так покругу. Счетчик в этом случаем может быть 1 байтным и хранить только sequence (порядковый номер) записи. Т.о. вы не только увеличите ресурс в 20 раз но и добъетесь отказоустойчивости, т.к. при отказе любой из записей вы может прочитать предыдущую.
Go to the top of the page
 
+Quote Post
zombi
сообщение Mar 1 2011, 15:01
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 076
Регистрация: 10-09-08
Пользователь №: 40 106



Цитата(defunct @ Mar 1 2011, 16:54) *
Лучше не ждать когда накрутит 100000, а просто каждую запись писать в следующие n-байт.

100%
Цитата(defunct @ Mar 1 2011, 16:54) *
Счетчик в этом случаем может быть 1 байтным и хранить только sequence (порядковый номер) записи.

Не согласен! Если просто хранить номер записи то младший бит будет меняться с каждым увеличением.

Думаю что в качестве указателя желательно применить :
a: "бегущий" бит ноль(единица) в байте (увеличение ресурса в 8 раз);
б: "бегущий" байт 00H(FFH) в массиве X[n] (увеличение ресурса в n раз).
Go to the top of the page
 
+Quote Post
defunct
сообщение Mar 3 2011, 16:20
Сообщение #4


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(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 ] не менять, пасиба.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Br.Misha   Энергонезависимая Память AVR   Feb 27 2011, 12:27
- - alexunder   Цитата(Br.Misha @ Feb 27 2011, 15:27) 4 б...   Feb 27 2011, 12:38
- - SysRq   [PDF] AVR101: High Endurance EEPROM Storage   Feb 27 2011, 12:53
|- - Леонид Иванович   Делал так: CODE//--------------------------------...   Feb 27 2011, 14:15
|- - Dimoza   Цитата(defunct @ Mar 1 2011, 15:54) сдела...   Mar 1 2011, 15:30
|- - zombi   Цитата(Dimoza @ Mar 1 2011, 19:30) И по в...   Mar 1 2011, 15:34
- - GDI   Только надо еще как то узнать о том что произошел ...   Mar 1 2011, 14:10
|- - demiurg_spb   Цитата(GDI @ Mar 1 2011, 17:10) Только на...   Mar 1 2011, 14:29
- - ukpyr   Цитата4 байта для хранения счетчика записейхватит ...   Mar 1 2011, 15:21
- - ArtemKAD   ЦитатаНи фигасе! Вот бы найти документальное п...   Mar 1 2011, 17:12
- - ukpyr   ЦитатаИ по возможности не располагать его с 0 адре...   Mar 1 2011, 17:53
|- - sgs   Цитата(ukpyr @ Mar 1 2011, 21:53) старая ...   Mar 2 2011, 07:34
|- - VladimirYU   Цитата(ukpyr @ Mar 1 2011, 20:53) старая ...   Mar 2 2011, 10:03
|- - demiurg_spb   image-craft тоже не использует по-инерции avr-gcc ...   Mar 2 2011, 12:06
|- - Petka   Цитата(demiurg_spb @ Mar 2 2011, 15:06) ....   Mar 2 2011, 17:44
|- - demiurg_spb   Цитата(Petka @ Mar 2 2011, 20:44) avr-gcc...   Mar 3 2011, 10:06
- - SysRq   А всё-таки, EEPROM в AVR страничной организации, и...   Mar 3 2011, 16:43
|- - defunct   Цитата(SysRq @ Mar 3 2011, 18:43) А всё-т...   Mar 3 2011, 16:47
- - zombi   To defunct. Я не могу понять что такое это sequenc...   Mar 3 2011, 16:58
|- - aaarrr   Цитата(zombi @ Mar 3 2011, 19:58) Я не мо...   Mar 3 2011, 22:21
||- - Сергей Борщ   QUOTE (aaarrr @ Mar 4 2011, 00:21) Размер...   Mar 4 2011, 11:00
|- - defunct   Цитата(zombi @ Mar 3 2011, 18:58) что так...   Mar 4 2011, 15:02
|- - zombi   Цитата(aaarrr @ Mar 4 2011, 01:21) Хранит...   Mar 5 2011, 11:34
- - SysRq   Цитата(defunct @ Mar 3 2011, 19:47) Всегд...   Mar 3 2011, 17:00
|- - zombi   Цитата(SysRq @ Mar 3 2011, 20:00) Тогда н...   Mar 3 2011, 17:13
- - ukpyr   ЦитатаОсталось только выяснить : приводит ли к исч...   Mar 3 2011, 22:06
- - SysRq   Цитата(zombi @ Mar 5 2011, 14:34) Т.е. по...   Mar 5 2011, 12:29
|- - zombi   Цитата(SysRq @ Mar 5 2011, 15:29) Убивает...   Mar 5 2011, 13:00
|- - SysRq   Цитата(zombi @ Mar 5 2011, 16:00) Но мне ...   Mar 5 2011, 13:54
|- - zombi   Цитата(SysRq @ Mar 5 2011, 16:54) Примерн...   Mar 5 2011, 20:23
|- - SysRq   Цитата(zombi @ Mar 5 2011, 23:23) Наверно...   Mar 5 2011, 20:34
|- - zombi   Цитата(SysRq @ Mar 5 2011, 23:34) Запись ...   Mar 5 2011, 22:47
- - 314   Почему-то всегда казалось, что тип флеш, использов...   Mar 5 2011, 14:55
- - SysRq   Выключил на 1'800'000. Изменил в исходнике...   Mar 5 2011, 16:23
- - SysRq   Результат записи 0x00 (по приведённому выше алгори...   Mar 6 2011, 06:24
|- - zombi   Цитата(SysRq @ Mar 6 2011, 09:24) Результ...   Mar 6 2011, 08:14
|- - aaarrr   Цитата(zombi @ Mar 6 2011, 11:14) Но 3...   Mar 6 2011, 15:48
- - SysRq   Результат записи постоянно меняющегося значения: у...   Mar 6 2011, 15:02
- - zombi   Провел эксперимент с ATmega162-16AU @ 5V @ 16MHz @...   Mar 14 2011, 09:41
- - Juk1976   Народ!!! Да не мучайте себя. Используй...   Mar 16 2011, 21:59
|- - aaarrr   Цитата(Juk1976 @ Mar 17 2011, 00:59) Испо...   Mar 16 2011, 22:34
- - 314   At24cXX - I2C- dip8 - 0.2-0.3$ более 1е6 запи...   Mar 17 2011, 06:33
- - nand7   Попробуйте провести эксперимент на температуре 125...   Mar 17 2011, 07:56


Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 19:27
Рейтинг@Mail.ru


Страница сгенерированна за 0.01495 секунд с 7
ELECTRONIX ©2004-2016