Перейти к содержанию
    

IAR: запись в EEPROM по прерыванию

Подскажите, пожалуйста, как в IAR оpганизовать запись во встроенную EEPROM из буфера по прерыванию, так чтобы это не мешало обращению к переменным в EEPROM как обычным переменным в памяти данных.

Изменено пользователем vitko

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Подскажите, пожалуйста, как в IAR оpганизовать запись во встроенную EEPROM из буфера по прерыванию, так чтобы это не мешало обращению к переменным в EEPROM как обычным переменным в памяти данных.

 

Может я не понял вопроса, но мне кажется как обычно в IAR. Определяете

 

#pragma vector = EE_READY_vect

__interrupt void EE_write (void)

{

.....

}

 

Первый элемент после проверки готовности ЕЕПРОМ пишите в той части программы где надо начать запись, устанавливаете счетчик, а далеее все последующие по прерываниям до тех пор пока не выберете весь буфер. Естествеено в соответствии с правилами обращения с ЕЕПРОМ согласно DS.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

VladimirYU, всё это конечно правильно, но речь шла о том, чтобы при этом можно было штатными средствами компилятора обращаться к обьектам в ЕЕПРОМ как к переменным.

Этой функциональности можно добиться объединив Ваш метод с тем, что предложил CSB.

Но я считаю, что это мало что даёт, т. к. в этом случае всё равно придётся ждать окончания записи всей очереди опрашивая некий флаг.

Не ждать этого события нельзя т. к. может возникнуть фоновое обращение к ЕЕПРОМ.

Отсюда следует, что полезность (а отсюда и применимость) прерываний от ЕЕПРОМ крайне мала при гораздо большей геморройности данного занятия, но это уже решать пользователю.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

VladimirYU, всё это конечно правильно, но речь шла о том, чтобы при этом можно было штатными средствами компилятора обращаться к обьектам в ЕЕПРОМ как к переменным.

Этой функциональности можно добиться объединив Ваш метод с тем, что предложил CSB.

Но я считаю, что это мало что даёт, т. к. в этом случае всё равно придётся ждать окончания записи всей очереди опрашивая некий флаг.

Не ждать этого события нельзя т. к. может возникнуть фоновое обращение к ЕЕПРОМ.

Отсюда следует, что полезность (а отсюда и применимость) прерываний от ЕЕПРОМ крайне мала при гораздо большей геморройности данного занятия, но это уже решать пользователю.

 

Игорь, полностью согласен. Сам никогда не использую прерывания при работе с ЕЕПРОМ, но решать, как вы правильно заметили, пользователю.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А, ну если с этой стороны на проблему смотреть

то да, сделать, как Владимир предложил,

либо завести FIFO и писать в него в фоне, а выгребать из него в прерывании (от EEPROM), конечно тормознее получится...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Мне нужно переписать N байт из ОЗУ в ЕЕПРОМ. Если я напишу:

 

for (i=0, i<N, i++ ) *EE_ptr++ = *RAM_ptr++ ;

 

- надеюсь компилятор не запретит глобально прерывания на все время записи масива ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да тут вообще все ок должно быть, только в прерываниях к еепром обращаться не надо и фсе...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Мне нужно переписать N байт из ОЗУ в ЕЕПРОМ. Если я напишу:

 

for (i=0, i<N, i++ ) *EE_ptr++ = *RAM_ptr++ ;

 

- надеюсь компилятор не запретит глобально прерывания на все время записи масива ?

Нет!

Если взглянуть как реализованы библиотечные функции обращения к ЕЕПРОМ (\avr\src\lib\eeprom.s90), то видно, что прерывания там запрещаются на крайне непродолжительное время.

Когда-то в форуме Кросплатформенный компилятор IAR я выкладывал доработанный файл eeprom.s90 (с исправленным багом). Поищите.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Нет!

Если взглянуть как реализованы библиотечные функции обращения к ЕЕПРОМ (\avr\src\lib\eeprom.s90), то видно, что прерывания там запрещаются на крайне непродолжительное время.

Когда-то в форуме Кросплатформенный компилятор IAR я выкладывал доработанный файл eeprom.s90 (с исправленным багом). Поищите.

 

Игорь, если не в тягость, в чем суть твоих изменений. Файл я нашел, но с родным еще не сличал. Заранее спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

IgorKossak писал

>Дело в глюке, содержащемся в файле avr/src/lib/eeprom.s90.

>В этом файле надо справить функцию __eeput64_16:

>- ?eeput16 заменить на ?eeput16_64;

>- ?eeput16_inc заменить на ?eeput16_64_inc.

>И далее включить этот файл в проект и компилировать/собирать >всё вместе.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Игорь, если не в тягость, в чем суть твоих изменений. Файл я нашел, но с родным еще не сличал. Заранее спасибо.

Кроме того, что ответил Вам CSB, там внесены некоторые незначительные изменения в правила доступа к ЕЕПРОМ.

PS Быстро сличать содержимое файлов\папок\архивов мне помогает WinMerge, хотя в сети полно и других средств.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Подскажите, пожалуйста, как в 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 или что-то еще ) опрашиваем окончание последней записи и запускаем новую(если надо),

ну и опять же как-то разруливаем возможные переполнения буфера(ну или как вариант,

делаем функцию опроса занятости буфера и пишем в него только если он свободен)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

И как нужно написать обработчик прерывания что бы он правильно разруливал

эту ситуацию (конкурирующие запросы на запись в eeprom)?

И не только на запись. Чтение сразу после записи требует окончания предыдущего процесса.

Не следует при этом забывать одно из пожелений в теме - обращение к обьектам в ЕЕПРОМ как к переменным.

При этом предположение, что всё можно поставить в очередь и эта очередь будет разгребаться где то по прерываниям, а фоновый процесс будет идти без ожиданий, по моему некорректно. Ибо прежде чем прочесть какую то переменную в одном процессе, нужно дождаться окончания записи, начатой в другом процессе (или в этом же). Ситуация, когда нужно только писать, может быть решена с помощью очереди, но это частный случай.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...