|
IAR: запись в EEPROM по прерыванию, как это организовать? |
|
|
|
May 24 2007, 10:22
|
Участник

Группа: Участник
Сообщений: 30
Регистрация: 8-03-06
Из: Kyiv, UA
Пользователь №: 15 066

|
Подскажите, пожалуйста, как в IAR оpганизовать запись во встроенную EEPROM из буфера по прерыванию, так чтобы это не мешало обращению к переменным в EEPROM как обычным переменным в памяти данных.
Сообщение отредактировал vitko - May 24 2007, 10:23
|
|
|
|
|
May 24 2007, 12:07
|
Местный
  
Группа: Свой
Сообщений: 426
Регистрация: 5-04-07
Из: Санкт-Петербург
Пользователь №: 26 782

|
Цитата(vitko @ May 24 2007, 14:22)  Подскажите, пожалуйста, как в IAR оpганизовать запись во встроенную EEPROM из буфера по прерыванию, так чтобы это не мешало обращению к переменным в EEPROM как обычным переменным в памяти данных. Может я не понял вопроса, но мне кажется как обычно в IAR. Определяете #pragma vector = EE_READY_vect __interrupt void EE_write (void) { ..... } Первый элемент после проверки готовности ЕЕПРОМ пишите в той части программы где надо начать запись, устанавливаете счетчик, а далеее все последующие по прерываниям до тех пор пока не выберете весь буфер. Естествеено в соответствии с правилами обращения с ЕЕПРОМ согласно DS.
|
|
|
|
|
May 24 2007, 12:48
|

Шаман
     
Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221

|
VladimirYU, всё это конечно правильно, но речь шла о том, чтобы при этом можно было штатными средствами компилятора обращаться к обьектам в ЕЕПРОМ как к переменным. Этой функциональности можно добиться объединив Ваш метод с тем, что предложил CSB. Но я считаю, что это мало что даёт, т. к. в этом случае всё равно придётся ждать окончания записи всей очереди опрашивая некий флаг. Не ждать этого события нельзя т. к. может возникнуть фоновое обращение к ЕЕПРОМ. Отсюда следует, что полезность (а отсюда и применимость) прерываний от ЕЕПРОМ крайне мала при гораздо большей геморройности данного занятия, но это уже решать пользователю.
|
|
|
|
|
May 24 2007, 13:15
|
Местный
  
Группа: Свой
Сообщений: 426
Регистрация: 5-04-07
Из: Санкт-Петербург
Пользователь №: 26 782

|
Цитата(IgorKossak @ May 24 2007, 16:48)  VladimirYU, всё это конечно правильно, но речь шла о том, чтобы при этом можно было штатными средствами компилятора обращаться к обьектам в ЕЕПРОМ как к переменным. Этой функциональности можно добиться объединив Ваш метод с тем, что предложил CSB. Но я считаю, что это мало что даёт, т. к. в этом случае всё равно придётся ждать окончания записи всей очереди опрашивая некий флаг. Не ждать этого события нельзя т. к. может возникнуть фоновое обращение к ЕЕПРОМ. Отсюда следует, что полезность (а отсюда и применимость) прерываний от ЕЕПРОМ крайне мала при гораздо большей геморройности данного занятия, но это уже решать пользователю. Игорь, полностью согласен. Сам никогда не использую прерывания при работе с ЕЕПРОМ, но решать, как вы правильно заметили, пользователю.
|
|
|
|
|
May 24 2007, 13:35
|
Участник

Группа: Участник
Сообщений: 30
Регистрация: 8-03-06
Из: Kyiv, UA
Пользователь №: 15 066

|
Мне нужно переписать N байт из ОЗУ в ЕЕПРОМ. Если я напишу: for (i=0, i<N, i++ ) *EE_ptr++ = *RAM_ptr++ ;
- надеюсь компилятор не запретит глобально прерывания на все время записи масива ?
|
|
|
|
|
May 24 2007, 13:50
|

Шаман
     
Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221

|
Цитата(vitko @ May 24 2007, 16:35)  Мне нужно переписать N байт из ОЗУ в ЕЕПРОМ. Если я напишу: for (i=0, i<N, i++ ) *EE_ptr++ = *RAM_ptr++ ;
- надеюсь компилятор не запретит глобально прерывания на все время записи масива ? Нет! Если взглянуть как реализованы библиотечные функции обращения к ЕЕПРОМ (\avr\src\lib\eeprom.s90), то видно, что прерывания там запрещаются на крайне непродолжительное время. Когда-то в форуме Кросплатформенный компилятор IAR я выкладывал доработанный файл eeprom.s90 (с исправленным багом). Поищите.
|
|
|
|
|
May 24 2007, 14:09
|
Местный
  
Группа: Свой
Сообщений: 426
Регистрация: 5-04-07
Из: Санкт-Петербург
Пользователь №: 26 782

|
Цитата(IgorKossak @ May 24 2007, 17:50)  Нет! Если взглянуть как реализованы библиотечные функции обращения к ЕЕПРОМ (\avr\src\lib\eeprom.s90), то видно, что прерывания там запрещаются на крайне непродолжительное время. Когда-то в форуме Кросплатформенный компилятор IAR я выкладывал доработанный файл eeprom.s90 (с исправленным багом). Поищите. Игорь, если не в тягость, в чем суть твоих изменений. Файл я нашел, но с родным еще не сличал. Заранее спасибо.
|
|
|
|
|
May 24 2007, 18:08
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(vitko @ May 24 2007, 14:22)  Подскажите, пожалуйста, как в IAR оpганизовать запись во встроенную EEPROM из буфера по прерыванию, так чтобы это не мешало обращению к переменным в EEPROM как обычным переменным в памяти данных. Цитата(vitko @ May 24 2007, 17:35)  Мне нужно переписать N байт из ОЗУ в ЕЕПРОМ. Если я напишу: for (i=0, i<N, i++ ) *EE_ptr++ = *RAM_ptr++ ;
- надеюсь компилятор не запретит глобально прерывания на все время записи масива ? Цитата(IgorKossak @ May 24 2007, 17:50)  Нет! Если взглянуть как реализованы библиотечные функции обращения к ЕЕПРОМ (\avr\src\lib\eeprom.s90), то видно, что прерывания там запрещаются на крайне непродолжительное время. И чем это поможет(запрет прерываний на очень короткое время) когда нужно писать в eeprom и из основного цикла и из прерывания ? И как нужно написать обработчик прерывания что бы он правильно разруливал эту ситуацию (конкурирующие запросы на запись в eeprom)? ИМХО Для столь медленного устройства каким является eeprom есть только 2 стратегии его использования 1. Все делаем в прерывании eeprom, заводим буфер обмена с eeprom, как-то разруливаем переполнение этого буфера. 2. Делаем все поллингом или через стандартный доступ к ЕЕ переменным в IAR, или, что намного лучше, если в системе есть переодическая обработка событий (например прерывание таймера/ ADC или что-то еще ) опрашиваем окончание последней записи и запускаем новую(если надо), ну и опять же как-то разруливаем возможные переполнения буфера(ну или как вариант, делаем функцию опроса занятости буфера и пишем в него только если он свободен)
|
|
|
|
|
May 24 2007, 20:28
|

Шаман
     
Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221

|
Цитата(singlskv @ May 24 2007, 21:08)  И как нужно написать обработчик прерывания что бы он правильно разруливал эту ситуацию (конкурирующие запросы на запись в eeprom)? И не только на запись. Чтение сразу после записи требует окончания предыдущего процесса. Не следует при этом забывать одно из пожелений в теме - обращение к обьектам в ЕЕПРОМ как к переменным. При этом предположение, что всё можно поставить в очередь и эта очередь будет разгребаться где то по прерываниям, а фоновый процесс будет идти без ожиданий, по моему некорректно. Ибо прежде чем прочесть какую то переменную в одном процессе, нужно дождаться окончания записи, начатой в другом процессе (или в этом же). Ситуация, когда нужно только писать, может быть решена с помощью очереди, но это частный случай.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|