Перейти к содержанию
    

AVR+Eeprom 2-serial Алгоритм увеличения количества записей

Есть Eeprom , ее ресурс записи максимум 1000000 раз.

Необходимо записывать данные примерно раз в 0.5-1 секунду на срок 30-50 лет....

Судя по расчетам на такое времени одной ячейки памяти не хватит...

Может кто встречался с алгоритмами записи (по разным ячейкам, по битово или еще как-то ) для таких многократных режимов write ????? :wub: :wub: :wub:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Идея простая - писать информацию по разным адресам EEPROM. Для этого надо знать характер записываемых данных, только тогда можно предложить эффективный алгоритм записи и восстановления данных.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я пишу по кольцу, а указатели храню в FRAM. FRAM у меня с чесами реального времени, супервизором и памятью на 32к. Если не использовать какой-то памяти для хранения указателей, то надо решить проблему синхронизации. Наверное можно строить запись таким образом, что она фиксированной длинны и имеет уникальный номер или дату время. Тогда при старте проц может отыскать место, куда ложить новую запись.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Самое простое писать по кольцу, следя чтоб было место для новой записи (это будет указатель на то куда писать новую запись) и если место кончается стирать "перед" собо1 (FF -> 00).

Не оригинально и признак начала записи может понадобиться, зато просто.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У Атмела есть аппноут, посвященный этому. Там организуется именно кольцевая запись, но без отдельного хранения указателя начала. Точно не помню как, но как-то очень просто :).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Точно не помню как, но как-то очень просто :).

Можно в заголовке записи указывать размер и номер записи перед самой записью. Получится нечто похожее на MCB (memory control block) цепочку в DOS.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Чтобы удвоить ресурс при записи счетчика, я пишу четные значения по одному адресу, а нечетные - по другому. При чтении читаются оба значения и выбирается бOльшее.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У Атмела есть аппноут, посвященный этому. Там организуется именно кольцевая запись, но без отдельного хранения указателя начала. Точно не помню как, но как-то очень просто :).

Хранить вообщем и не надо. Нодо чтоб всегда было свободное место. и искать его снизу вверх (или наоборот - зависит от подхода).

Если остаются место под 1 запись надо очистить старую (заголовак может подтереть) и потом уже записать. и так по кругу. самая свежая запись перед свободным полем

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

30 г. = 946 080 000 сеk. т.е. как минимум нужен колцевои запись в 1024 ячеики. 1 баит FRAM стоит наверно менше чем 1024 баит EEPROM.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А можно подключить компаратор на контроль падения напряжения питания и при его срабатывании запрещать все прерывания и сохранять данные. Если контролировать питание до стабилизатора то времени хватит забить байт 100 (зависит от емкости конденсатора перед стабилизатором).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Fram Дороже Eeprom , поэтому выбор руковадстав пао на Eeprom :(

Да довольно 'компетентное' у Вас руководство... при непрерывной записи с интервалом в 0.5 сек. eeprom-ма хватит всего лишь на ~5.5 лет. :)

А чем внутреннее ОЗУ то неустраивает?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Совсем недавно аналогичная задача встала из-за непредсказуемого на объекте поведения питалова...

Так вот. Если запрещенных комбинаций нет (типа FF или 00), то придется делать два кольца...вот я и увеличивал время жизни 128 раз. Весь косяк в том, что нельзя переписать битовые поля отдельно друг от друга. Поэтому время жизни обозначено для байта и точка.

 

unsigned char __eeprom EE_ring[128] @ 128;

unsigned long __eeprom EE_abs_DATA_num[128] @ 256;

 

void EE_ring_restore(void)

{

unsigned char i;

for(i=0;i<128;i++)

{

if(EE_ring==0x00)

{

ring = i;

break;

}

}

if(ring==128)

{

ring=0;

EE_ring[0]=0;

}

}

 

 

void EE_do_new_ring(void)

{

EE_ring[ring]=0xFF;

ring = (ring+1)&127;

EE_ring[ring]=0;

}

 

ring - глобальная в сраме. Потом в майне обращаюсь к EE_abs_DATA_num[ring]

И память перетирать при этом не страшно!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Задачу можно решить более простым способом, которая увеличит срок службы системы не до 50-ти, а более лет. На вычислительное устройство, как автономный источник питания ставиться ионистр (на случай сбоя внешнего питания) и периодически контролируется внешнее питание. Запись данных производится в ОЗУ. При обнаружении отключения внешнего питания, данные начинают записываться в eeprom либо система с течением времени (в зависимости от энергоресурса ионистора) консервируется до 'до лучших времен'. Поведенческих вариантов системы можно придумать великое множество исходя из условий эксплуатации.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...