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

 
 
4 страниц V   1 2 3 > »   
Reply to this topicStart new topic
> Энергонезависимая Память 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
alexunder
сообщение Feb 27 2011, 12:38
Сообщение #2


unexpected token
****

Группа: Свой
Сообщений: 899
Регистрация: 31-08-06
Из: Мехелен, Брюссель
Пользователь №: 19 987



Цитата(Br.Misha @ Feb 27 2011, 15:27) *
4 байта для хранения счетчика записей. После каждой записи я буду увеличивать счетчик на 1 и когда дойдет до 100000, то буду записывать даные и счетчик в следующие 20 байт, получается, циклов записи будет около 2 милионов (для атмега8). Как вам идея?


Так наверное будет работать, только зачем для счетчика до 100000 использовать 4 байта, когда достаточно 3-х: 2^24 = 16777216? Ну это так, для экономии памяти sm.gif
100000 раз применительно к каждому биту, я считаю.


--------------------
А у тебя SQUID, и значит, мы умрем.
Go to the top of the page
 
+Quote Post
SysRq
сообщение Feb 27 2011, 12:53
Сообщение #3


Чайник, 1 литр
****

Группа: Свой
Сообщений: 655
Регистрация: 17-05-06
Из: Moscow
Пользователь №: 17 168



[PDF] AVR101: High Endurance EEPROM Storage
Go to the top of the page
 
+Quote Post
Леонид Иванович
сообщение Feb 27 2011, 14:15
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 318
Регистрация: 21-07-06
Из: Минск
Пользователь №: 18 986



Делал так:

CODE
//----------------------------------------------------------------------------

//Eeprom support module

//----------------------------------------------------------------------------

#include <Main.h>
#include <Eeprom.h>

//------------------------------ Constants: ----------------------------------

#define RBUFF 100 //EEPROM ring buffer size
#define RSIG 0xDA //record header signature

//------------------------------ Variables: ----------------------------------

typedef struct
{
char Sig; //record header signature
bool On; //On flag
int Val; //stored value
} EVal;

__no_init __eeprom int EData[EE_N]; //EEPROM data array
__no_init __eeprom EVal EVals[RBUFF]; //EEPROM ring buffer

static char EePnt = 0; //pointer to currently used record

//-------------------------- Read EEPROM data: -------------------------------

int Eeprom_Read(char a)
{
return(EData[a]); //read parameter
}

//-------------------------- Write EEPROM data: -------------------------------

void Eeprom_Write(char a, int d)
{
if(EData[a] != d) //if parameter changed
{
EData[a] = d; //write parameter
__watchdog_reset(); //watchdog reset
}
}

//-------------------------- Read V from EEPROM: -----------------------------

int Eeprom_ReadV(bool *on)
{
EePnt = RBUFF; //set incorrect pointer value
for(char i = 0; i < RBUFF; i++) //search signature in ring buffer
if(EVals[i].Sig == RSIG) //if signature found
{
EePnt = i; //initialize pointer
break;
}
if(EePnt == RBUFF) //if pointer incorrect (signature not found)
{
EePnt = 0; //set pointer to first array record
*on = 0; //supply off
return(0); //return V = 0
}
*on = EVals[EePnt].On; //read on flag
return(EVals[EePnt].Val); //read V
}

//--------------------------- Write V to EEPROM: -----------------------------

void Eeprom_WriteV(int v, bool on)
{
char NewPnt = EePnt; //save previous pointer value
if(NewPnt++ == RBUFF) //advance pointer
NewPnt = 0; //roll-up pointer
EVals[NewPnt].On = on; //save on flag
EVals[NewPnt].Val = v; //save V
EVals[NewPnt].Sig = RSIG; //save signature at new location
EVals[EePnt].Sig = 0xFF; //clear signature at old location
__watchdog_reset(); //watchdog reset
EePnt = NewPnt; //save new pointer value
}

//----------------------------------------------------------------------------


Сообщение отредактировал IgorKossak - Feb 27 2011, 15:21
Причина редактирования: Бездумное оформление кода


--------------------
Go to the top of the page
 
+Quote Post
defunct
сообщение Mar 1 2011, 12:54
Сообщение #5


кекс
******

Группа: Свой
Сообщений: 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
GDI
сообщение Mar 1 2011, 14:10
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008



Только надо еще как то узнать о том что произошел отказ, для этого можно писать еще и какую-то контрольную сумму в каждую запись, и проверять ее при чтении, вот тогда и можно будет определившись что данные испорчены, поискать предыдущие валидные записи.


--------------------
http://www.embedders.org Блоги разработчиков электроники.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Mar 1 2011, 14:29
Сообщение #7


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(GDI @ Mar 1 2011, 17:10) *
Только надо еще как то узнать о том что произошел отказ...
Узнавать-то вроде и не надо. Номер последней записи обновляется _после_ записи данных.
Всё само-собой получается.
Производитель гарантирует 100тыс циклов записи, так что наворачивать еще что-либо сверх рекомендованного в аппноте ИМХО не резонно.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
zombi
сообщение Mar 1 2011, 15:01
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 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
ukpyr
сообщение Mar 1 2011, 15:21
Сообщение #9


Профессионал
*****

Группа: Участник
Сообщений: 1 264
Регистрация: 17-06-08
Из: бандустан
Пользователь №: 38 347



Цитата
4 байта для хранения счетчика записей
хватит и 2х
Go to the top of the page
 
+Quote Post
Dimoza
сообщение Mar 1 2011, 15:30
Сообщение #10


Частый гость
**

Группа: Свой
Сообщений: 120
Регистрация: 21-08-06
Из: СПб
Пользователь №: 19 701



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

И по возможности не располагать его с 0 адреса в еепром. Вроде даже где-то в апликухах об этом говорилось: в AVR при неблагоприятном стечении обстоятельств значение в нулевой ячейке может быть утеряно.
Go to the top of the page
 
+Quote Post
zombi
сообщение Mar 1 2011, 15:34
Сообщение #11


Гуру
******

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



Цитата(Dimoza @ Mar 1 2011, 19:30) *
И по возможности не располагать его с 0 адреса в еепром. Вроде даже где-то в апликухах об этом говорилось: в AVR при неблагоприятном стечении обстоятельств значение в нулевой ячейке может быть утеряно.

Ни фигасе! Вот бы найти документальное подтверждение этому.
Go to the top of the page
 
+Quote Post
ArtemKAD
сообщение Mar 1 2011, 17:12
Сообщение #12


Профессионал
*****

Группа: Свой
Сообщений: 1 508
Регистрация: 26-06-06
Из: Киев
Пользователь №: 18 364



Цитата
Ни фигасе! Вот бы найти документальное подтверждение этому.

Если найдешь Errata на старые AVR (к примеру At90S2313), то там такое было. Если reset проходил во время записи EEPROM, то адрес записи слетал в 0 и портилась нулевая ячейка.
Go to the top of the page
 
+Quote Post
ukpyr
сообщение Mar 1 2011, 17:53
Сообщение #13


Профессионал
*****

Группа: Участник
Сообщений: 1 264
Регистрация: 17-06-08
Из: бандустан
Пользователь №: 38 347



Цитата
И по возможности не располагать его с 0 адреса в еепром.
старая байка, уже давно не актуальная
Go to the top of the page
 
+Quote Post
sgs
сообщение Mar 2 2011, 07:34
Сообщение #14


Участник
*

Группа: Участник
Сообщений: 54
Регистрация: 25-01-06
Из: Самара
Пользователь №: 13 578



Цитата(ukpyr @ Mar 1 2011, 21:53) *
старая байка, уже давно не актуальная

Для рабочего режима - может быть. Однако при отладке с помощью JTAGICE II довольно часто портится именно 0 ячейка EEPROM. С чем это связано - неизвестно. Возможно, с процессом заливки новой программы? Естественно, программирование EEPROM при этом запрещено. Портится именно 0 ячейка, далее - все в порядке...
Go to the top of the page
 
+Quote Post
VladimirYU
сообщение Mar 2 2011, 10:03
Сообщение #15


Местный
***

Группа: Свой
Сообщений: 426
Регистрация: 5-04-07
Из: Санкт-Петербург
Пользователь №: 26 782



Цитата(ukpyr @ Mar 1 2011, 20:53) *
старая байка, уже давно не актуальная

тем не менее IAR при стандартных настройках 0-ую ячейку ЕЕПРОМ не пользует.
Go to the top of the page
 
+Quote Post

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

 


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


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