vitko 0 24 мая, 2007 Опубликовано 24 мая, 2007 (изменено) · Жалоба Подскажите, пожалуйста, как в IAR оpганизовать запись во встроенную EEPROM из буфера по прерыванию, так чтобы это не мешало обращению к переменным в EEPROM как обычным переменным в памяти данных. Изменено 24 мая, 2007 пользователем vitko Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
CSB 0 24 мая, 2007 Опубликовано 24 мая, 2007 · Жалоба Пологаю нужно переписывать eeprom.s90 для работы с прерыванием. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
BratherLU 0 24 мая, 2007 Опубликовано 24 мая, 2007 · Жалоба Я бы просто запретил прерывания на время обращения к еепром в фоне для начала... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladimirYU 0 24 мая, 2007 Опубликовано 24 мая, 2007 · Жалоба Подскажите, пожалуйста, как в IAR оpганизовать запись во встроенную EEPROM из буфера по прерыванию, так чтобы это не мешало обращению к переменным в EEPROM как обычным переменным в памяти данных. Может я не понял вопроса, но мне кажется как обычно в IAR. Определяете #pragma vector = EE_READY_vect __interrupt void EE_write (void) { ..... } Первый элемент после проверки готовности ЕЕПРОМ пишите в той части программы где надо начать запись, устанавливаете счетчик, а далеее все последующие по прерываниям до тех пор пока не выберете весь буфер. Естествеено в соответствии с правилами обращения с ЕЕПРОМ согласно DS. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
IgorKossak 0 24 мая, 2007 Опубликовано 24 мая, 2007 · Жалоба VladimirYU, всё это конечно правильно, но речь шла о том, чтобы при этом можно было штатными средствами компилятора обращаться к обьектам в ЕЕПРОМ как к переменным. Этой функциональности можно добиться объединив Ваш метод с тем, что предложил CSB. Но я считаю, что это мало что даёт, т. к. в этом случае всё равно придётся ждать окончания записи всей очереди опрашивая некий флаг. Не ждать этого события нельзя т. к. может возникнуть фоновое обращение к ЕЕПРОМ. Отсюда следует, что полезность (а отсюда и применимость) прерываний от ЕЕПРОМ крайне мала при гораздо большей геморройности данного занятия, но это уже решать пользователю. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladimirYU 0 24 мая, 2007 Опубликовано 24 мая, 2007 · Жалоба VladimirYU, всё это конечно правильно, но речь шла о том, чтобы при этом можно было штатными средствами компилятора обращаться к обьектам в ЕЕПРОМ как к переменным. Этой функциональности можно добиться объединив Ваш метод с тем, что предложил CSB. Но я считаю, что это мало что даёт, т. к. в этом случае всё равно придётся ждать окончания записи всей очереди опрашивая некий флаг. Не ждать этого события нельзя т. к. может возникнуть фоновое обращение к ЕЕПРОМ. Отсюда следует, что полезность (а отсюда и применимость) прерываний от ЕЕПРОМ крайне мала при гораздо большей геморройности данного занятия, но это уже решать пользователю. Игорь, полностью согласен. Сам никогда не использую прерывания при работе с ЕЕПРОМ, но решать, как вы правильно заметили, пользователю. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
BratherLU 0 24 мая, 2007 Опубликовано 24 мая, 2007 · Жалоба А, ну если с этой стороны на проблему смотреть то да, сделать, как Владимир предложил, либо завести FIFO и писать в него в фоне, а выгребать из него в прерывании (от EEPROM), конечно тормознее получится... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vitko 0 24 мая, 2007 Опубликовано 24 мая, 2007 · Жалоба Мне нужно переписать N байт из ОЗУ в ЕЕПРОМ. Если я напишу: for (i=0, i<N, i++ ) *EE_ptr++ = *RAM_ptr++ ; - надеюсь компилятор не запретит глобально прерывания на все время записи масива ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
BratherLU 0 24 мая, 2007 Опубликовано 24 мая, 2007 · Жалоба Да тут вообще все ок должно быть, только в прерываниях к еепром обращаться не надо и фсе... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
IgorKossak 0 24 мая, 2007 Опубликовано 24 мая, 2007 · Жалоба Мне нужно переписать N байт из ОЗУ в ЕЕПРОМ. Если я напишу: for (i=0, i<N, i++ ) *EE_ptr++ = *RAM_ptr++ ; - надеюсь компилятор не запретит глобально прерывания на все время записи масива ? Нет! Если взглянуть как реализованы библиотечные функции обращения к ЕЕПРОМ (\avr\src\lib\eeprom.s90), то видно, что прерывания там запрещаются на крайне непродолжительное время. Когда-то в форуме Кросплатформенный компилятор IAR я выкладывал доработанный файл eeprom.s90 (с исправленным багом). Поищите. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladimirYU 0 24 мая, 2007 Опубликовано 24 мая, 2007 · Жалоба Нет! Если взглянуть как реализованы библиотечные функции обращения к ЕЕПРОМ (\avr\src\lib\eeprom.s90), то видно, что прерывания там запрещаются на крайне непродолжительное время. Когда-то в форуме Кросплатформенный компилятор IAR я выкладывал доработанный файл eeprom.s90 (с исправленным багом). Поищите. Игорь, если не в тягость, в чем суть твоих изменений. Файл я нашел, но с родным еще не сличал. Заранее спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
CSB 0 24 мая, 2007 Опубликовано 24 мая, 2007 · Жалоба IgorKossak писал >Дело в глюке, содержащемся в файле avr/src/lib/eeprom.s90. >В этом файле надо справить функцию __eeput64_16: >- ?eeput16 заменить на ?eeput16_64; >- ?eeput16_inc заменить на ?eeput16_64_inc. >И далее включить этот файл в проект и компилировать/собирать >всё вместе. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
IgorKossak 0 24 мая, 2007 Опубликовано 24 мая, 2007 · Жалоба Игорь, если не в тягость, в чем суть твоих изменений. Файл я нашел, но с родным еще не сличал. Заранее спасибо. Кроме того, что ответил Вам CSB, там внесены некоторые незначительные изменения в правила доступа к ЕЕПРОМ. PS Быстро сличать содержимое файлов\папок\архивов мне помогает WinMerge, хотя в сети полно и других средств. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
singlskv 0 24 мая, 2007 Опубликовано 24 мая, 2007 · Жалоба Подскажите, пожалуйста, как в IAR оpганизовать запись во встроенную EEPROM из буфера по прерыванию, так чтобы это не мешало обращению к переменным в EEPROM как обычным переменным в памяти данных. Мне нужно переписать N байт из ОЗУ в ЕЕПРОМ. Если я напишу: for (i=0, i<N, i++ ) *EE_ptr++ = *RAM_ptr++ ; - надеюсь компилятор не запретит глобально прерывания на все время записи масива ? Нет! Если взглянуть как реализованы библиотечные функции обращения к ЕЕПРОМ (\avr\src\lib\eeprom.s90), то видно, что прерывания там запрещаются на крайне непродолжительное время. И чем это поможет(запрет прерываний на очень короткое время) когда нужно писать в eeprom и из основного цикла и из прерывания ? И как нужно написать обработчик прерывания что бы он правильно разруливал эту ситуацию (конкурирующие запросы на запись в eeprom)? ИМХО Для столь медленного устройства каким является eeprom есть только 2 стратегии его использования 1. Все делаем в прерывании eeprom, заводим буфер обмена с eeprom, как-то разруливаем переполнение этого буфера. 2. Делаем все поллингом или через стандартный доступ к ЕЕ переменным в IAR, или, что намного лучше, если в системе есть переодическая обработка событий (например прерывание таймера/ ADC или что-то еще ) опрашиваем окончание последней записи и запускаем новую(если надо), ну и опять же как-то разруливаем возможные переполнения буфера(ну или как вариант, делаем функцию опроса занятости буфера и пишем в него только если он свободен) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
IgorKossak 0 24 мая, 2007 Опубликовано 24 мая, 2007 · Жалоба И как нужно написать обработчик прерывания что бы он правильно разруливал эту ситуацию (конкурирующие запросы на запись в eeprom)? И не только на запись. Чтение сразу после записи требует окончания предыдущего процесса. Не следует при этом забывать одно из пожелений в теме - обращение к обьектам в ЕЕПРОМ как к переменным. При этом предположение, что всё можно поставить в очередь и эта очередь будет разгребаться где то по прерываниям, а фоновый процесс будет идти без ожиданий, по моему некорректно. Ибо прежде чем прочесть какую то переменную в одном процессе, нужно дождаться окончания записи, начатой в другом процессе (или в этом же). Ситуация, когда нужно только писать, может быть решена с помощью очереди, но это частный случай. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться