Работа eeprom в AVR.

Обсуждаем контроллеры компании Atmel.
Ответить
Опытный кот
Аватара пользователя
Сообщения: 838
Зарегистрирован: Вт апр 12, 2011 18:38:19
Откуда: с Земли

Сообщение coredumped »

king-live писал(а):

Код: Выделить всё

чтобы не было кирдыку вместо eeprom_write_xxxxx надо использовать eeprom_update_xxxxx. последняя функция перед тем. как что-то писать в ячейку, проверяет, не то же самое там записано? и, если то же самое, то запись не делает - это сильно увеличивает ресурс записей, хотя на 100% и не снимает проблему...
А это уже интересно! Не нужно отдельно проверять разницу информации. Но всёже запутался в полученной информации, вернее недопонимаю. Хожу гдето рядом....
Всёже опишите пожалуйста на моём примере. Я ещё слаб в программировании.
Спасибо.
На практике, я обычно завожу переменную-флаг, которая сигнализирует о том, что есть что сохранять в епром, те о том, что данные изменились. И потом, в процедуре сохранения уже принимается решение писать - не писать. Можете использовать update_..., это уже дело вкуса. В любом случае, логически нужно постараться избегать лишних (не нужных) операций записи в епром.
Все будет только лучше, в крайнем случае - хуже.
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

king-live писал(а):А это уже интересно! Не нужно отдельно проверять разницу информации. Но всёже запутался в полученной информации, вернее недопонимаю. Хожу гдето рядом....
Всёже опишите пожалуйста на моём примере. Я ещё слаб в программировании.
Спасибо.
ну, можно например свести все eeprom-данные в структуру:

Код: Выделить всё

typedef struct{
   int coefficient;
   long init_value;
   // и так далее
} stored_data;

EEMEM stored_data e_config;

stored_data config;

int main(void){
   // загружаем конфиг из EEPROM
   eeprom_read_block(&config, &e_config, sizeof(stored_data));
   // далее делаем свои черные дела
   // в том числе ИЗМЕНЯЕМ поля config
   // после каждого изменения сохраняем обратно в EEPROM
   eeprom_update_block(&e_config, &config, sizeof(stored_data));
   // при этом реально будут записаны только те поля, которые на самом деле изменили свое значение, а не все подряд
   // то есть не все ячейки будут расходовать свой ресурс.
}
если изменение данных происходит от действий человека - проблем нет никаких: скорее всего, девайс скорее сломается или устареет, чем человек сделает 100 тысяч изменений настроек :) поэтому задумываться о ресурсе не нужно вообще.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
YS
Друг Кота
Аватара пользователя
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05

Сообщение YS »

Это сейчас умный GCC warning кинет и скомпилит, а в старые времена, пока return ченить не поставишь, хрен оно скомпилится, я это хорошо помню, посему и леплю ретурны "на автомате".
Ну, я из нового поколения, и таких древностей не помню. :) Первое, что мои руки пишут на автомате -

Код: Выделить всё

#include <avr/io.h>

void main(void)
{

  while (1);
}
AVR-GCC говорит на это warning: return type of 'main' is not 'int'. Но мне как-то пофиг, ибо я за здравый смысл. :)
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Контактная информация:
Прорезались зубы
Сообщения: 238
Зарегистрирован: Сб янв 29, 2011 20:26:48

Сообщение king-live »

Спасибо! Попробую затолкать всё в структуру. Хотя работать буду всеголишь с 2мя переменными, которые нужно сохранять в eeprom. И на счёт "переменной-флаг" тоже идея хорошая. Попробую.
Реклама
Эиком - электронные компоненты и радиодетали
Открыл глаза
Сообщения: 53
Зарегистрирован: Вт апр 13, 2010 03:00:00

Сообщение sdsrem »

Доброго дня всем.
Прочитал тему и возник один вопрос.
Было написанно что чел гонял EEPROM неделю и хоть бы што, хотя должен был помереть через пару минут, но так как гнал одно и тоже то EEPROM не пострадал.
Вопрос, стоит ли тогда замарачиваться с обновлением EEPROMа ежели при записи тех же данных он не будет стареть.

Или же всётаки EEPROM при записи сперва стирается а потом пишиться, но тогда у чела EEPROM должен был помереть.
Реклама
Опытный кот
Аватара пользователя
Сообщения: 842
Зарегистрирован: Чт дек 31, 2009 19:27:45
Откуда: Бровари, Україна

Сообщение avreal »

YS писал(а):AVR-GCC говорит на это warning: return type of 'main' is not 'int'. Но мне как-то пофиг, ибо я за здравый смысл. :)
-Wno-main есть достаточно убедительной просьбой не ворчать.
В С++ это не катит, зато в С++ по стандарту нормально написать

Код: Выделить всё

int main()
{
    for(;;) {}
}
Так как именно для main() происходит автоматическая подстановка return 0; при отсутствии возврата от щедрот программиста. В том числе если там не for(;;) {}, а реальный возврат.
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Контактная информация:
Реклама
Опытный кот
Аватара пользователя
Сообщения: 842
Зарегистрирован: Чт дек 31, 2009 19:27:45
Откуда: Бровари, Україна

Сообщение avreal »

sdsrem писал(а):Или же всётаки EEPROM при записи сперва стирается а потом пишиться, но тогда у чела EEPROM должен был помереть.
Может он уже в коме. Т.е. при данных напряжении питания и температуре ещё пишет (хотя надо попробовать записать туда другие данные), а при -20 и другом напряжении питания уже фигушки. А контроллер из другой партии еще три дня назад и при тех же условиях перестал бы писаться (то, что кто-то пил-курил и прожил 90 лет -- еще не означает, что я дотнул бы и до 40, если бы пил/курил).
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Контактная информация:
Вымогатель припоя
Аватара пользователя
Сообщения: 672
Зарегистрирован: Вт окт 27, 2009 22:39:19
Откуда: Москва

Сообщение md5sum »

coredumped писал(а):Следующий эксперимент, где последовательно заносились значения 0x00 и 0xFF подтвердили догадку, и то епром отработал по-моему 3-х кратную норму, точно не помню.
Что считать нормой? Данные в ДШ - это минимальное кол-во циклов стирания/записи, которое выдержит память. А большее кол-во никем не запрещено :)
— Не говорите мне что делать и я не скажу куда Вам идти...
Опытный кот
Аватара пользователя
Сообщения: 838
Зарегистрирован: Вт апр 12, 2011 18:38:19
Откуда: с Земли

Сообщение coredumped »

md5sum писал(а):
coredumped писал(а):Следующий эксперимент, где последовательно заносились значения 0x00 и 0xFF подтвердили догадку, и то епром отработал по-моему 3-х кратную норму, точно не помню.
Что считать нормой? Данные в ДШ - это минимальное кол-во циклов стирания/записи, которое выдержит память. А большее кол-во никем не запрещено :)
Да, конечно. В ДШ значится гарантированное количество циклов записи. Те при самых плохих условиях использования, гарантируется не меньше этого количества операций. Больше есс-но никто не запрещает, но правильный результат уже не гарантируется.
Все будет только лучше, в крайнем случае - хуже.
Опытный кот
Аватара пользователя
Сообщения: 802
Зарегистрирован: Сб дек 19, 2009 14:51:11
Откуда: Нашенский

Сообщение Eprinter »

А вот интересно...
В CVAVR обращение к переменным в еепром сделано супер просто, никаких наворотов (страничка из книги в прикошаченном файле).
Получается, что CVAVR при компиляции сам подставляет нужные куски кода, или автор не совсем в теме?
Вложения
eeprom.gif
(62.32 КБ) 556 скачиваний
[color=#006699]In der großen Familie nicht kluven klatz-klatz![/color]
YS
Друг Кота
Аватара пользователя
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05

Сообщение YS »

Получается, что CVAVR при компиляции сам подставляет нужные куски кода
Да. IAR делает так же. Но, ясно, надо иметь в виду, что специфика EEPROM от этого никуда не девается, и присваивать в такую переменную надо с пониманием того, что она не вечна.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Контактная информация:
Встал на лапы
Аватара пользователя
Сообщения: 92
Зарегистрирован: Пт ноя 25, 2011 18:20:52

Сообщение coding »

А 1млн. перезаписываней - это для пространства всей памяти eeprom или для каждого бита отдельно? т.е. если писать только значение по адресу 0х01 до отказа, то после отказа остальная область будет рабочая или крендык?
Контактная информация:
Встал на лапы
Сообщения: 146
Зарегистрирован: Вс сен 16, 2012 22:00:40

Сообщение foton6 »

Доброго времени суток)
Столкнулся с EEPROM и возникла пара вопросов:

//При обьявлении переменной (AtmalStudio 6) выделяются первые "N" бит в зависимости от типа переменной?
И если записать в МК другую программу работающую тоже с EEPROM, то переменная того же типа что была обьявлена в предыдущей программе,
но с другим именем будет иметь значение из прошлой программы?

и если обьявлять так:
uint8_t EEMEM A;
То каждый раз при нажатии "reset", А будет всегда иметь значение записанное до сброса?Не будет ли она обнулятся при каждом новом обьявлении?
pcb
Опытный кот
Сообщения: 833
Зарегистрирован: Пт авг 12, 2011 09:14:27
Откуда: Млечный путь/Земля/РФ/Екатеринбург

Сообщение pcb »

coding писал(а):А 1млн. перезаписываней - это для пространства всей памяти eeprom или для каждого бита отдельно? т.е. если писать только значение по адресу 0х01 до отказа, то после отказа остальная область будет рабочая или крендык?
Да чо вы раздули. Еепром несколько миллисекунд переписывается. более точно надо дш смотреть.

По теме.

Очень удобно использовать структуры, как, на на примере выше, показали.
Все переменные и коэф за раз при загрузке контроллера подгружаются.
Разработал:
-BLDC
-ФУОЗ/МПСЗ
-SMART BMS
-ECU/EDC на STM32F4(43%)+CPLD(57%)
-Моноинжектор на ATSAMD20G16
-контроллер эффектов для RGB LED ленты
-умные часы/обратный счет/секундомер
-устройство измерения емкости АКБ
Открыл глаза
Аватара пользователя
Сообщения: 59
Зарегистрирован: Сб авг 28, 2010 13:29:43
Откуда: Докучаевск, Донецк

Сообщение Финский »

Заявленный фирмой Atmel ресурс EEPROM памяти микроконтроллеров AVR, равный 100 тысячам циклов запись/чтение, относится к ресурсу одного байта памяти, а не к целой странице.
Тест EEPROM памяти AVR микроконтроллера.
[color=#800000]Техноманьяк и IT-шаман. Танцы с бубном на дому.[/color]
Контактная информация:
pcb
Опытный кот
Сообщения: 833
Зарегистрирован: Пт авг 12, 2011 09:14:27
Откуда: Млечный путь/Земля/РФ/Екатеринбург

Сообщение pcb »

антиресный опыт.

Запихнут когда нибудь ферритовую память в процессоры? :tea:
Разработал:
-BLDC
-ФУОЗ/МПСЗ
-SMART BMS
-ECU/EDC на STM32F4(43%)+CPLD(57%)
-Моноинжектор на ATSAMD20G16
-контроллер эффектов для RGB LED ленты
-умные часы/обратный счет/секундомер
-устройство измерения емкости АКБ
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Сообщение COKPOWEHEU »

Так наоборот, уходят от магнитной записи. Существуют ведь экзотические сейчас микросхемы на ЦМД. С другой стороны в компьютерах иногда заменяют жесткие диски на SSD. Если уж так хочется энергонезависимости - проще организовать резервное питание и режимы сна.
pcb
Опытный кот
Сообщения: 833
Зарегистрирован: Пт авг 12, 2011 09:14:27
Откуда: Млечный путь/Земля/РФ/Екатеринбург

Сообщение pcb »

Заблуждаетесь.
Разработал:
-BLDC
-ФУОЗ/МПСЗ
-SMART BMS
-ECU/EDC на STM32F4(43%)+CPLD(57%)
-Моноинжектор на ATSAMD20G16
-контроллер эффектов для RGB LED ленты
-умные часы/обратный счет/секундомер
-устройство измерения емкости АКБ
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Сообщение COKPOWEHEU »

Я не говорю что уходят везде и всюду. Все-таки ограниченный ресурс перезаписи - существенный недостаток flash. Как и высокая стоимость на единицу объема. Разумеется, там, где информация должна часто перезаписываться при высокой надежности хранения (сервера например), магнитный диск предпочтительнее. Но такие применения имеют мало отношения к встраиваемым системам. Их особенности - редко изменяемая программа, низкое потребление, сравнительно низкая вычислительная мощность.
YS
Друг Кота
Аватара пользователя
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05

Сообщение YS »

Запихнут когда нибудь ферритовую память в процессоры?
Уже запихнули, и это решение уже доступно на рынке.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Контактная информация:
Ответить

Вернуться в «AVR»