|
Еще одни грабли от IAR AVR, на этот раз касабельно EEPROM |
|
|
|
 |
Ответов
|
Jul 20 2006, 09:04
|
Профессионал
    
Группа: Свой
Сообщений: 1 508
Регистрация: 26-06-06
Из: Киев
Пользователь №: 18 364

|
Цитата(arttab @ Jul 20 2006, 04:42)  Какая версия IAR? Последняя не профи. Цитата Вопрос первый: Зачем запрещать прерывания если программа уже находится в прерывании? Из него плавно вытекает второй: как компилятор определит что в одном случае функция вызвана из прерывания и запрещать не нужно а в другом случае из фона и запрещать нужно? Компилятор должен был запретить прерывания при всех обращениях в основном цикле... Как - это уже отдельная тема. У компилятора более чем один способ решить этот вопрос. Цитата Если уж вы решили извратиться и работать с eeprom в прерывании (что само по себе уже глюк, только алгоритма) Ну, не знал, что чтение в прерывании флагов сохраняемых в EEPROM в каком-то другом месте это глюк  ... Цитата(Семён @ 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; } Вы не поверите - компилятор делает так-же  ... Вот только представте, что произойдет если EEPROM_write было вызвано при не запрещенных прерываниях, а в прерывании вызвано EEPROM_read. И это самое прерывание попало между EEAR=adres; и EEDR=data; Результат ясен? Тоже самое когда без запрета прерывания будет вызван EEPROM_read. Только там последствия сразу не столь разрушительные....
|
|
|
|
|
Jul 20 2006, 09:32
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(ArtemKAD @ Jul 20 2006, 12:04)  Компилятор должен был запретить прерывания при всех обращениях в основном цикле... Как - это уже отдельная тема. У компилятора более чем один способ решить этот вопрос. Огласите хотя бы один способ. Цитата(ArtemKAD @ Jul 20 2006, 12:04)  Цитата Если уж вы решили извратиться и работать с eeprom в прерывании (что само по себе уже глюк, только алгоритма) Ну, не знал, что чтение в прерывании флагов сохраняемых в EEPROM в каком-то другом месте это глюк  ... Теперь знаете - вы сами на него напоролись. Для обхода приходится запрещать прерывания в основном цикле, хотя без этого можно было обойтись. Обращение к eeprom требует ожидания готовности eeprom, а ожидание чего-либо находясь в прерывании - ошибка алгоритма. TomaT абсолютно прав. Копии данных, которые могут потребоваться в прерывании надо держать в ОЗУ. И грабли сразу исчезнут. А главное, компилятор сразу станет не виноват.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jul 20 2006, 10:58
|
Профессионал
    
Группа: Свой
Сообщений: 1 508
Регистрация: 26-06-06
Из: Киев
Пользователь №: 18 364

|
Цитата(Сергей Борщ @ Jul 20 2006, 12:32)  Цитата(ArtemKAD @ Jul 20 2006, 12:04)  Компилятор должен был запретить прерывания при всех обращениях в основном цикле... Как - это уже отдельная тема. У компилятора более чем один способ решить этот вопрос.
Огласите хотя бы один способ. PUSH/POP-нуть глобальные временные регистры EEAR, EEDR... Цитата Цитата(ArtemKAD @ Jul 20 2006, 12:04)  Цитата Если уж вы решили извратиться и работать с eeprom в прерывании (что само по себе уже глюк, только алгоритма) Ну, не знал, что чтение в прерывании флагов сохраняемых в EEPROM в каком-то другом месте это глюк  ... Теперь знаете - вы сами на него напоролись. Для обхода приходится запрещать прерывания в основном цикле, хотя без этого можно было обойтись. Обращение к eeprom требует ожидания готовности eeprom, а ожидание чего-либо находясь в прерывании - ошибка алгоритма. Даже при разрешенных прерываниях? Даже если ожидаемое событие все равно глобально должно поменять весь алгоритм работы? Цитата TomaT абсолютно прав. Копии данных, которые могут потребоваться в прерывании надо держать в ОЗУ. И грабли сразу исчезнут. Исправить эти грабли не сложно - сложнее на них не наступить особенно когда о "такой малости" в доках ни слова...
|
|
|
|
Сообщений в этой теме
ArtemKAD Еще одни грабли от IAR AVR Jul 19 2006, 19:55  Семён [quote name='ArtemKAD' date='Jul 20 20... Jul 20 2006, 09:15    Сергей Борщ Цитата(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  SasaVitebsk Цитата(ArtemKAD @ Jul 20 2006, 12:04) Вы ... Jul 23 2006, 20:44 Сергей Борщ Цитата(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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|