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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> Доступ к EEPROM в IAR, ЗАпрещены ли прерывания в программе на момент чтения EEPROM в IAR
miv
сообщение Jan 26 2006, 14:16
Сообщение #16


Участник
*

Группа: Участник
Сообщений: 41
Регистрация: 29-08-05
Из: С-Петербург
Пользователь №: 8 055



"Сколько времени работаю с 'IAR Embedded Workbench 4.10B' и никаких проблем не возникало... Незнаю, как Вы работаете с EEPROM, а я предпочитаю не мудрить и использовать чтение/запись, как к обычным переменным объявленные в EEPROM. Просто посмотрите свой ассемблерный код после компиляции и все станет ясно, что на 'автомате' запрещение и разрешение прерываний там не генерируется. А в прерываниях на которые Вы сетуете необходимо учитывать автоматическое запрещение при входе в прерывание."

Да ну ! Насколько я помню аж в 2.28 ну может в 3.10 при таком способе общения с EEPROM компиллер вставляет вызов подпрограмки (встроенной) в которой он и запрещает прерывания !
Go to the top of the page
 
+Quote Post
Sergio66
сообщение Jan 26 2006, 14:29
Сообщение #17


Местный
***

Группа: Свой
Сообщений: 235
Регистрация: 9-02-05
Пользователь №: 2 526



А если представить ситуацию, при которой происходит следующее:
Программа читает данные из EEPROM, в случайный момент времени, когда процесс получения данных еще не закончен, возникает прерывание, в теле которого происходит также доступ к EEPROM, однако уже к другим переменным. Что в итоге???? Возможна порча данных или нет?
Go to the top of the page
 
+Quote Post
miv
сообщение Jan 26 2006, 14:40
Сообщение #18


Участник
*

Группа: Участник
Сообщений: 41
Регистрация: 29-08-05
Из: С-Петербург
Пользователь №: 8 055



Дык я про это и толкую ! biggrin.gif
Go to the top of the page
 
+Quote Post
BVU
сообщение Jan 26 2006, 15:11
Сообщение #19


Профессионал
*****

Группа: Свой
Сообщений: 1 301
Регистрация: 30-11-04
Из: Россия, Н.Новгород
Пользователь №: 1 264



Цитата(miv @ Jan 26 2006, 17:16) *
"Сколько времени работаю с 'IAR Embedded Workbench 4.10B' и никаких проблем не возникало... Незнаю, как Вы работаете с EEPROM, а я предпочитаю не мудрить и использовать чтение/запись, как к обычным переменным объявленные в EEPROM. Просто посмотрите свой ассемблерный код после компиляции и все станет ясно, что на 'автомате' запрещение и разрешение прерываний там не генерируется. А в прерываниях на которые Вы сетуете необходимо учитывать автоматическое запрещение при входе в прерывание."

Да ну ! Насколько я помню аж в 2.28 ну может в 3.10 при таком способе общения с EEPROM компиллер вставляет вызов подпрограмки (встроенной) в которой он и запрещает прерывания !

Согласен, ошибался... sad.gif нашел 'злачное место' в коде:
\ ?Subroutine23:
\ 00000000 94F8 CLI
\ 00000002 2D07 MOV R16, R7
\ 00000004 .... LDI R20, LOW(e_pressure)
\ 00000006 .... LDI R21, (e_pressure) >> 8
\ 00000008 .... RCALL __eeput8_16
\ 0000000A 9478 SEI
\ 0000000C 9508 RET
но как я понимаю эта процедура лишь для записи в eeprom...


--------------------
Не корысти ради, не в целях наживы, а во исполнение велений души!
Go to the top of the page
 
+Quote Post
KRS
сообщение Jan 27 2006, 07:44
Сообщение #20


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Цитата(Sergio66 @ Jan 26 2006, 17:29) *
А если представить ситуацию, при которой происходит следующее:
Программа читает данные из EEPROM, в случайный момент времени, когда процесс получения данных еще не закончен, возникает прерывание, в теле которого происходит также доступ к EEPROM, однако уже к другим переменным. Что в итоге???? Возможна порча данных или нет?


Порча данных в самом EEPROM не возможна! А вот полученные данные могут быть не праивльными если между записью адреса в EEAR, установкой бита в EECR и чтением EEDR возникло прерывание, в которм есть чтение EEPROM, вы просто получите байт данных с другого адреса
Но сами данные в EEPROM портится не должны.
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Jan 27 2006, 12:54
Сообщение #21


Шаман
******

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



Я уже подробно говорил об этом.
В аттаче см. исправления для функций работы с EEPROM.
Go to the top of the page
 
+Quote Post
Sergio66
сообщение Jan 27 2006, 18:12
Сообщение #22


Местный
***

Группа: Свой
Сообщений: 235
Регистрация: 9-02-05
Пользователь №: 2 526



Замечательная дискуссия!
Спасибо всем. Я уже разобрался сам!
Действительно, удалось выяснить, что возникало наложение одной процедуры чтения на другую. Результат был неприятным.
Событие настолько редкое, что порой приходилось ждать по 3 суток его возникновения.
На решение таких задачек даже времени не жалко!!!
Go to the top of the page
 
+Quote Post
defunct
сообщение Jan 27 2006, 18:38
Сообщение #23


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Я бы на Вашем месте, учитывая что обращения к EEPROM идет как из обработчика прерывания так и из основного цикла программы поступил бы следующим образом:

1. Взял бы даташит на контроллер с которым собираюсь работать.
2. Написал бы функции чтения/записи EEPROM руководствуясь даташитом с запретом прерываний. (ДЛЯ ИСПОЛЬЗОВАНИЯ ИЗ ОСНОВНОГО ЦИКЛА ПРОГРАММЫ)
3. Написал бы аналогичные функции чтения/записи EEPROM без запрета прерываний (ДЛЯ ИСПОЛЬЗОВАНИЯ ВНУТРИ ОБРАБОТЧИКОВ ПРЕРЫВАНИЙ)
4. Использовал бы только свои функции.

и не имел бы никаких проблем с затиранием.

PS: Доверия к тому, что IAR'е учтена возможность работы с EEPROM внутри обработчика прерывания у меня нет. А если этот момент не учтен, то обращение к EEPROM из обработчика прерывания приведет к разрешению прерываний и как следствие к повторному возбуждению одного и того же обработчика.
Go to the top of the page
 
+Quote Post
sz36
сообщение Jan 28 2006, 12:41
Сообщение #24


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

Группа: Свой
Сообщений: 91
Регистрация: 26-01-06
Пользователь №: 13 668



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

Поэтому, чтобы EEPROM не портилась, выходов 2.
1) Обрамлять каждое обращение к EEPROM запретом/разрешением прерываний, причем перед разрешением вручную дожидаться окончания записи
2) В прерывании сохранять/восстанавливать контекст EEPRM/ Вот пример из рабочего проекта:

#pragma vector=INT0_vect
__interrupt void USBNHandler(void)
{
char EAddr;
char EData;
//сохраняю контекст EEPROM
while(EECR&0x03); //жду окончания предыдущей записи (сброса EEWE, EERE)
EAddr=EEARL;
EData=EEDR;

//...обрабатываю прерывание, читаю-пишу EEPROM

//восстанавливаю контекст EEPROM
while(EECR&0x03); //жду сброса EEWE, EERE
EEARL=EAddr;
EEDR=EData;
}

Ну и третий, самый разумный подход - отказаться от обращения к EEPROM в прерываниях
Go to the top of the page
 
+Quote Post
vet
сообщение Jan 28 2006, 17:10
Сообщение #25


Знающий
****

Группа: Свой
Сообщений: 550
Регистрация: 16-06-04
Из: Казань
Пользователь №: 32



sz36
4-й выход - перейти на CodeVision cool.gif


--------------------
Главная линия этого опуса ясна мне насквозь!
Go to the top of the page
 
+Quote Post

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

 


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


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