Sergio66 0 17 марта, 2005 Опубликовано 17 марта, 2005 · Жалоба Еще один вопрос - никак не могу найти ни одной библиотечной функции для доступа к EEPROM. Компилятор Embedded C++, библиотека DLIB. Подскажите, плз. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
IgorKossak 0 17 марта, 2005 Опубликовано 17 марта, 2005 · Жалоба Не нужно никакой функции. Просто обьявите переменную в области EEPROM: __eeprom int MyIntEEPROMVar; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Sergio66 0 17 марта, 2005 Опубликовано 17 марта, 2005 · Жалоба Еще один вопрос - никак не могу найти ни одной библиотечной функции для доступа к EEPROM. Компилятор Embedded C++, библиотека DLIB. Подскажите, плз. <{POST_SNAPBACK}> И что, доступ к ней ничем не будет отличаться от доступа к обычным переменным в SRAM???????? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KRS 1 17 марта, 2005 Опубликовано 17 марта, 2005 · Жалоба Еще один вопрос - никак не могу найти ни одной библиотечной функции для доступа к EEPROM. Компилятор Embedded C++, библиотека DLIB. Подскажите, плз. <{POST_SNAPBACK}> И что, доступ к ней ничем не будет отличаться от доступа к обычным переменным в SRAM???????? <{POST_SNAPBACK}> Да для программы на С это прозрачно! просто компилер вызывает функцию записи или чтения проще всего посмотреть листинг. только вот время записи получается большое и это надо учитывать Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
IgorKossak 0 18 марта, 2005 Опубликовано 18 марта, 2005 · Жалоба !!! Не следует также забывать, что количество записей в EEPROM не бесконечно. В этом случае функция больше мобилизировала бы, но зато не так элегантно выглядело бы. И ещё, в EEPROM нельзя объявлять объекты, имеющие конструктор и деструктор (из C++). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
-Tумблер- 0 18 марта, 2005 Опубликовано 18 марта, 2005 · Жалоба Еще один вопрос - никак не могу найти ни одной библиотечной функции для доступа к EEPROM. Компилятор Embedded C++, библиотека DLIB. Подскажите, плз. <{POST_SNAPBACK}> Возьмем да и напишем : #define EEMWE_BIT (1<<2) #define EEWE_BIT (1<<1) #define EERE_BIT (1<<0) #define _EEPUT_(ADR,VAL) {while (EECR & EEWE_BIT); \ EEAR = (ADR); EEDR = (VAL); _CLI();EECR = EEMWE_BIT; EECR = EEWE_BIT;_SEI();} #define _EEGET_(VAR, ADR) {while (EECR & EEWE_BIT); \ EEAR = (ADR); EECR = EERE_BIT; while (EECR & EERE_BIT);(VAR) = EEDR;} :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
IgorKossak 0 18 марта, 2005 Опубликовано 18 марта, 2005 · Жалоба #define _EEPUT_(ADR,VAL) {while (EECR & EEWE_BIT); \ EEAR = (ADR); EEDR = (VAL); _CLI();EECR = EEMWE_BIT; EECR = EEWE_BIT;_SEI();} <{POST_SNAPBACK}> Комбинация _CLI()/_SEI() плоха, т. к. прерывания до этого могут быть запрещены. EECR |= EEMWE_BIT; EECR |= EEWE_BIT; // скомпилируется намного оптимальнее Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KRS 1 18 марта, 2005 Опубликовано 18 марта, 2005 · Жалоба #define _EEPUT_(ADR,VAL) {while (EECR & EEWE_BIT); \ EEAR = (ADR); EEDR = (VAL); _CLI();EECR = EEMWE_BIT; EECR = EEWE_BIT;_SEI();} <{POST_SNAPBACK}> Комбинация _CLI()/_SEI() плоха, т. к. прерывания до этого могут быть запрещены. EECR |= EEMWE_BIT; EECR |= EEWE_BIT; // скомпилируется намного оптимальнее <{POST_SNAPBACK}> Это не поможет! потому что между этими командами не должно быть больше 4 циклов! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
IgorKossak 0 18 марта, 2005 Опубликовано 18 марта, 2005 · Жалоба Это не поможет! потому что между этими командами не должно быть больше 4 циклов! <{POST_SNAPBACK}> И не будет. Вот что получается: 146 _EEPUT_(0x2456,0x56); \ 00000000 99E1 SBIC 0x1C,0x01 \ 00000002 CFFE RJMP ??init_1 \ 00000004 E506 LDI R16,86 \ 00000006 E214 LDI R17,36 \ 00000008 BB1F OUT 0x1F,R17 \ 0000000A BB0E OUT 0x1E,R16 \ 0000000C BB0D OUT 0x1D,R16 \ 0000000E 94F8 CLI \ 00000010 9AE2 SBI 0x1C,0x02 \ 00000012 9AE1 SBI 0x1C,0x01 \ 00000014 9478 SEI Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KRS 1 18 марта, 2005 Опубликовано 18 марта, 2005 · Жалоба Это не поможет! потому что между этими командами не должно быть больше 4 циклов! <{POST_SNAPBACK}> И не будет. Вот что получается: 146 _EEPUT_(0x2456,0x56); \ 00000000 99E1 SBIC 0x1C,0x01 \ 00000002 CFFE RJMP ??init_1 \ 00000004 E506 LDI R16,86 \ 00000006 E214 LDI R17,36 \ 00000008 BB1F OUT 0x1F,R17 \ 0000000A BB0E OUT 0x1E,R16 \ 0000000C BB0D OUT 0x1D,R16 \ 0000000E 94F8 CLI \ 00000010 9AE2 SBI 0x1C,0x02 \ 00000012 9AE1 SBI 0x1C,0x01 \ 00000014 9478 SEI <{POST_SNAPBACK}> Откуда взялись в листинге CLI и SEI ? вы же и хотели их убрать Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vet 0 18 марта, 2005 Опубликовано 18 марта, 2005 · Жалоба Откуда взялись в листинге CLI и SEI ? вы же и хотели их убрать <{POST_SNAPBACK}> Меняем _CLI() на char sreg_temp = SREG; _CLI(); а _SEI() на SREG = sreg_temp Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
IgorKossak 0 21 марта, 2005 Опубликовано 21 марта, 2005 · Жалоба ...Откуда взялись в листинге CLI и SEI ? вы же и хотели их убрать <{POST_SNAPBACK}> Листингом я хотел обратить внимание на преимущества EECR |= EEMWE_BIT; EECR |= EEWE_BIT; против EECR = EEMWE_BIT; EECR = EEWE_BIT; в Вашем примере. А что касается прерываний, то у меня в рабочих проектах сделано как у vet. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
IgorKossak 0 21 марта, 2005 Опубликовано 21 марта, 2005 · Жалоба Существует бесконечно малое количество причин в применении макроса вместо обьявления переменной в области __eeprom. Накладные расходы на вызов функции при этом ничтожно малы по сравнению с длительностью записи, использование стека - 1 слово. Зато компактность программы намного возрастает и, что очень важно, повышается наглядность и безопасность использования типизированных обьектов (ошибки, если они есть, вылазят ещё на этапе компиляции). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
-Tумблер- 0 22 марта, 2005 Опубликовано 22 марта, 2005 · Жалоба Существует бесконечно малое количество причин в применении макроса вместо обьявления переменной в области __eeprom. Могу обьяснить "свою" причину - я не считаю EEPROM памятью вообще. Считаю раз и навсегда "это" - внешним устройством. А для этого гораздо удобнее использовать макрос или функцию (безразлично - дело вкуса или наличия ресурсов). И совершенно неудобно использовать обьявление переменной. Это связано с потенциально высокой уязвимостью этой области памяти, cбои которой стали уже притчей-во-языцах. Гдето в недрах этой конференции я уж писал, как сделать, чтобы было хорошо. И совершенно очевидно, что вероятность сбоя EEPROM-a слишком высока "просто принципиально", что бы можно было использовать ее просто как память, которая "не забывает после выключения". :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
IgorKossak 0 23 марта, 2005 Опубликовано 23 марта, 2005 · Жалоба Интересное мнение, хотя и не бесспорное. Из под моего начала вышло более 50000 устройств (с AVR) за последние 5 - 6 лет и ничто не дало мне повод усомниться в EEPROM как именно в памяти. Просто в нашем отделе принято читать и Datasheets и Erratasheets и различные hints и recomendations как программистские, так и конструкторские. И когда мне говорят о проблемах, которые даже "притча во языцех", то я совершенно честно не знаю чем помочь. Появление квалификатора __eeprom привнесло много удобств и совершенно не добавило проблем, т. к. сейчас библиотечные функции решают то, что раньше решалось вручную. Тем не менее. Хотелось бы услышать мнения и других пользователей. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться