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

 
 
> Еще одни грабли от IAR AVR, на этот раз касабельно EEPROM
ArtemKAD
сообщение Jul 19 2006, 19:55
Сообщение #1


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

Группа: Свой
Сообщений: 1 508
Регистрация: 26-06-06
Из: Киев
Пользователь №: 18 364



При чтении ЕЕPROM в прерывании нет сохранения регистров адреса/данных(EEAR EEDR). Или что то-же самое - не защищаются от прерываний участок с момента записи EEAR EEDR до собственно подачи комманды чтения/записи.
Результат - при работе с ЕЕPROM в прерывании возможна ситация когда разрушаются адрес или данные в операции чтения/записи из основного цикла. В связи с редкостью подобного события возможен крайне трудноуловимый глюк angry.gif ...

Сообщение отредактировал ArtemKAD - Jul 19 2006, 19:58
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
arttab
сообщение Jul 20 2006, 01:42
Сообщение #2


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

Группа: Свой
Сообщений: 1 432
Регистрация: 7-12-04
Из: Новосибирск
Пользователь №: 1 371



Какая версия IAR?


--------------------
OrCAD, Altium,IAR, AVR....
Go to the top of the page
 
+Quote Post
ArtemKAD
сообщение Jul 20 2006, 09:04
Сообщение #3


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

Группа: Свой
Сообщений: 1 508
Регистрация: 26-06-06
Из: Киев
Пользователь №: 18 364



Цитата(arttab @ Jul 20 2006, 04:42) *
Какая версия IAR?

Последняя не профи.
Цитата
Вопрос первый: Зачем запрещать прерывания если программа уже находится в прерывании?
Из него плавно вытекает второй: как компилятор определит что в одном случае функция вызвана из прерывания и запрещать не нужно а в другом случае из фона и запрещать нужно?

Компилятор должен был запретить прерывания при всех обращениях в основном цикле... Как - это уже отдельная тема. У компилятора более чем один способ решить этот вопрос.
Цитата
Если уж вы решили извратиться и работать с eeprom в прерывании (что само по себе уже глюк, только алгоритма)

Ну, не знал, что чтение в прерывании флагов сохраняемых в EEPROM в каком-то другом месте это глюк cranky.gif ...

Цитата(Семён @ Jul 20 2006, 11:35) *
Предпочитаю работать с EEPROM вот так из основного цикла программы, когда знаю что, все прерывания запрещены и не что мне не помешает:

void EEPROM_write(unsigned int adres,unsigned char data)
{
while(EECR & (1<<1));
EEAR=adres;
EEDR=data;
EECR |= (1<<2);
EECR |= (1<<1);
}

unsigned char EEPROM_read(unsigned int adres)
{
while(EECR & (1<<1));
EEAR=adres;
EECR |= (1<<0);
return EEDR;
}

Вы не поверите - компилятор делает так-же biggrin.gif ... Вот только представте, что произойдет если EEPROM_write было вызвано при не запрещенных прерываниях, а в прерывании вызвано EEPROM_read. И это самое прерывание попало между
EEAR=adres; и EEDR=data;
Результат ясен?

Тоже самое когда без запрета прерывания будет вызван EEPROM_read. Только там последствия сразу не столь разрушительные....
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Jul 23 2006, 20:44
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(ArtemKAD @ Jul 20 2006, 12:04) *
Вы не поверите - компилятор делает так-же biggrin.gif ... Вот только представте, что произойдет если EEPROM_write было вызвано при не запрещенных прерываниях, а в прерывании вызвано EEPROM_read. И это самое прерывание попало между
EEAR=adres; и EEDR=data;
Результат ясен?

Тоже самое когда без запрета прерывания будет вызван EEPROM_read. Только там последствия сразу не столь разрушительные....


Кстати аналогичное может произойти не только с EEPROM. И не только в СИ. smile.gif

В своё время я нарвался на очень редко проявляющуюся ошибку. При выяснении причин выяснилось что в фоне я делаю сравнение 16-ти битного указателя кольцевого буфера (для определения XON/XOFF) Ну а в прерывании он изменяется. Так вот, если прерывание вызывается м/у сравнением 1-го и 2-ого байта, а в это время в прерывании осуществляется переход по кольцу ... то возникала ошибка. smile.gif

Поэтому если в прерывании изменяются какие-нибудь длинные переменные, то при работе с ними в голове надо или синхронизировать или запрещать прерывания.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- ArtemKAD   Еще одни грабли от IAR AVR   Jul 19 2006, 19:55
- - arttab   Какая версия IAR?   Jul 20 2006, 01:42
|- - Семён   [quote name='ArtemKAD' date='Jul 20 20...   Jul 20 2006, 09:15
|- - Сергей Борщ   Цитата(ArtemKAD @ Jul 20 2006, 12:04) Ком...   Jul 20 2006, 09:32
||- - ArtemKAD   Цитата(Сергей Борщ @ Jul 20 2006, 12:32) ...   Jul 20 2006, 10:58
||- - Сергей Борщ   Цитата(ArtemKAD @ Jul 20 2006, 13:58) Цит...   Jul 20 2006, 11:17
|||- - ArtemKAD   Цитата(Сергей Борщ @ Jul 20 2006, 14:17) ...   Jul 20 2006, 11:49
|||- - Сергей Борщ   Цитата(ArtemKAD @ Jul 20 2006, 14:49) Вы ...   Jul 20 2006, 12:05
|||- - ArtemKAD   Цитата(Сергей Борщ @ Jul 20 2006, 15:05) ...   Jul 20 2006, 12:47
||- - xemul   Цитата(ArtemKAD @ Jul 20 2006, 14:58) Даж...   Jul 20 2006, 11:35
||- - TomaT   Цитата(ArtemKAD @ Jul 20 2006, 14:58) ......   Jul 21 2006, 10:46
- - Сергей Борщ   Цитата(ArtemKAD @ Jul 19 2006, 22:55) При...   Jul 20 2006, 07:26
- - Семён   Цитата(ArtemKAD @ Jul 19 2006, 23:55) При...   Jul 20 2006, 08:35
- - TomaT   Может и бывает нужда такая, но я не очень понимаю ...   Jul 20 2006, 09:12
- - IgorKossak   Судя по всему, никто из отвечавших здесь не заглян...   Jul 21 2006, 09:30
|- - ArtemKAD   Цитата(IgorKossak @ Jul 21 2006, 12:30) С...   Jul 21 2006, 20:29
|- - Сергей Борщ   Цитата(ArtemKAD @ Jul 21 2006, 23:29) Цит...   Jul 22 2006, 10:03
|- - ArtemKAD   Цитата(Сергей Борщ @ Jul 22 2006, 13:03) ...   Jul 22 2006, 10:42
|- - Сергей Борщ   Цитата(ArtemKAD @ Jul 22 2006, 13:42) Цит...   Jul 22 2006, 11:14
- - xemul   ЦитатаСудя по всему, никто из отвечавших здесь не ...   Jul 21 2006, 10:44


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

 


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


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