реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> IAR: запись в EEPROM по прерыванию, как это организовать?
vitko
сообщение May 24 2007, 10:22
Сообщение #1


Участник
*

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



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

Сообщение отредактировал vitko - May 24 2007, 10:23
Go to the top of the page
 
+Quote Post
CSB
сообщение May 24 2007, 11:38
Сообщение #2


Частый гость
**

Группа: Новичок
Сообщений: 100
Регистрация: 9-03-06
Пользователь №: 15 088



Пологаю нужно переписывать eeprom.s90 для работы с прерыванием.
Go to the top of the page
 
+Quote Post
BratherLU
сообщение May 24 2007, 12:03
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 103
Регистрация: 16-05-06
Пользователь №: 17 126



Я бы просто запретил прерывания на время обращения к еепром в фоне для начала...
Go to the top of the page
 
+Quote Post
VladimirYU
сообщение May 24 2007, 12:07
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 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.
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение May 24 2007, 12:48
Сообщение #5


Шаман
******

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



VladimirYU, всё это конечно правильно, но речь шла о том, чтобы при этом можно было штатными средствами компилятора обращаться к обьектам в ЕЕПРОМ как к переменным.
Этой функциональности можно добиться объединив Ваш метод с тем, что предложил CSB.
Но я считаю, что это мало что даёт, т. к. в этом случае всё равно придётся ждать окончания записи всей очереди опрашивая некий флаг.
Не ждать этого события нельзя т. к. может возникнуть фоновое обращение к ЕЕПРОМ.
Отсюда следует, что полезность (а отсюда и применимость) прерываний от ЕЕПРОМ крайне мала при гораздо большей геморройности данного занятия, но это уже решать пользователю.
Go to the top of the page
 
+Quote Post
VladimirYU
сообщение May 24 2007, 13:15
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 426
Регистрация: 5-04-07
Из: Санкт-Петербург
Пользователь №: 26 782



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


Игорь, полностью согласен. Сам никогда не использую прерывания при работе с ЕЕПРОМ, но решать, как вы правильно заметили, пользователю.
Go to the top of the page
 
+Quote Post
BratherLU
сообщение May 24 2007, 13:27
Сообщение #7


Частый гость
**

Группа: Свой
Сообщений: 103
Регистрация: 16-05-06
Пользователь №: 17 126



А, ну если с этой стороны на проблему смотреть
то да, сделать, как Владимир предложил,
либо завести FIFO и писать в него в фоне, а выгребать из него в прерывании (от EEPROM), конечно тормознее получится...
Go to the top of the page
 
+Quote Post
vitko
сообщение May 24 2007, 13:35
Сообщение #8


Участник
*

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



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

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

- надеюсь компилятор не запретит глобально прерывания на все время записи масива ?
Go to the top of the page
 
+Quote Post
BratherLU
сообщение May 24 2007, 13:50
Сообщение #9


Частый гость
**

Группа: Свой
Сообщений: 103
Регистрация: 16-05-06
Пользователь №: 17 126



Да тут вообще все ок должно быть, только в прерываниях к еепром обращаться не надо и фсе...
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение May 24 2007, 13:50
Сообщение #10


Шаман
******

Группа: Модераторы
Сообщений: 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 (с исправленным багом). Поищите.
Go to the top of the page
 
+Quote Post
VladimirYU
сообщение May 24 2007, 14:09
Сообщение #11


Местный
***

Группа: Свой
Сообщений: 426
Регистрация: 5-04-07
Из: Санкт-Петербург
Пользователь №: 26 782



Цитата(IgorKossak @ May 24 2007, 17:50) *
Нет!
Если взглянуть как реализованы библиотечные функции обращения к ЕЕПРОМ (\avr\src\lib\eeprom.s90), то видно, что прерывания там запрещаются на крайне непродолжительное время.
Когда-то в форуме Кросплатформенный компилятор IAR я выкладывал доработанный файл eeprom.s90 (с исправленным багом). Поищите.


Игорь, если не в тягость, в чем суть твоих изменений. Файл я нашел, но с родным еще не сличал. Заранее спасибо.
Go to the top of the page
 
+Quote Post
CSB
сообщение May 24 2007, 14:21
Сообщение #12


Частый гость
**

Группа: Новичок
Сообщений: 100
Регистрация: 9-03-06
Пользователь №: 15 088



IgorKossak писал
>Дело в глюке, содержащемся в файле avr/src/lib/eeprom.s90.
>В этом файле надо справить функцию __eeput64_16:
>- ?eeput16 заменить на ?eeput16_64;
>- ?eeput16_inc заменить на ?eeput16_64_inc.
>И далее включить этот файл в проект и компилировать/собирать >всё вместе.
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение May 24 2007, 15:06
Сообщение #13


Шаман
******

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



Цитата(VladimirYU @ May 24 2007, 17:09) *
Игорь, если не в тягость, в чем суть твоих изменений. Файл я нашел, но с родным еще не сличал. Заранее спасибо.

Кроме того, что ответил Вам CSB, там внесены некоторые незначительные изменения в правила доступа к ЕЕПРОМ.
PS Быстро сличать содержимое файлов\папок\архивов мне помогает WinMerge, хотя в сети полно и других средств.
Go to the top of the page
 
+Quote Post
singlskv
сообщение May 24 2007, 18:08
Сообщение #14


дятел
*****

Группа: Свой
Сообщений: 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 или что-то еще ) опрашиваем окончание последней записи и запускаем новую(если надо),
ну и опять же как-то разруливаем возможные переполнения буфера(ну или как вариант,
делаем функцию опроса занятости буфера и пишем в него только если он свободен)
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение May 24 2007, 20:28
Сообщение #15


Шаман
******

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



Цитата(singlskv @ May 24 2007, 21:08) *
И как нужно написать обработчик прерывания что бы он правильно разруливал
эту ситуацию (конкурирующие запросы на запись в eeprom)?

И не только на запись. Чтение сразу после записи требует окончания предыдущего процесса.
Не следует при этом забывать одно из пожелений в теме - обращение к обьектам в ЕЕПРОМ как к переменным.
При этом предположение, что всё можно поставить в очередь и эта очередь будет разгребаться где то по прерываниям, а фоновый процесс будет идти без ожиданий, по моему некорректно. Ибо прежде чем прочесть какую то переменную в одном процессе, нужно дождаться окончания записи, начатой в другом процессе (или в этом же). Ситуация, когда нужно только писать, может быть решена с помощью очереди, но это частный случай.
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 7th July 2025 - 12:14
Рейтинг@Mail.ru


Страница сгенерированна за 0.01511 секунд с 7
ELECTRONIX ©2004-2016