|
SAM7SE застревает прерывание |
|
|
|
May 27 2013, 16:51
|
Группа: Новичок
Сообщений: 7
Регистрация: 19-09-09
Пользователь №: 52 458

|
AT91SAM7SE512. На SYS_IRQ (ID=2) висит обработчик. Всё работает долго и успешно, но в какой-то момент обработчик перестаёт вызываться. При этом, AIC_IPR=2 , AIC_IMR=2 , AIC_DCR.GMSK=0 , CPSR.I=0 , CPSR.MODE без изменений. А обработчик не вызывается. Вот как такое может быть?! Подскажите, люди добрые!
|
|
|
|
|
 |
Ответов
|
May 27 2013, 20:58
|
Группа: Новичок
Сообщений: 7
Регистрация: 19-09-09
Пользователь №: 52 458

|
Цитата(aaarrr @ May 27 2013, 23:26)  Проверьте, нет ли вероятности выхода из какого-либо прерывания без записи AIC_EOICR. Вероятность всегда есть  Только вот где бы это могло случиться, я не вижу. Во всех обработчиках, return один и последним оператором. А предпоследним EOICR. Ну допустим, что где-то, что-то сглючивается, и вылетает она из какого-нибудь обработчика посередине. А увидеть, что AIC_EOICR не записали в каком-нибудь регистре можно? Цитата(aaarrr @ May 28 2013, 00:53)  Код *AT91C_AIC_ICCR=1<<AT91C_ID_SYS; Если прерывание сконфигурировано для работы по уровню, то эта строчка не имеет смысла; если по фронту - это готовый источник проблем. А, да, это атавизм. Спасибо, уберу.
|
|
|
|
|
May 27 2013, 21:27
|
Группа: Новичок
Сообщений: 7
Регистрация: 19-09-09
Пользователь №: 52 458

|
Цитата(aaarrr @ May 28 2013, 01:14)  Увы, нет. Печалько... Но видимо, больше ничего быть не может. Буду пока копать в этом направлении. Спасибо за подсказку.
|
|
|
|
|
May 27 2013, 21:36
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(KITA @ May 28 2013, 01:27)  Печалько... Но видимо, больше ничего быть не может. Буду пока копать в этом направлении. Спасибо за подсказку. Похоже: сброс внутри прерывания по записи ICCR тоже привел бы к неработающим прерываниям, но в этом случае не было бы единички в IPR. UPD: или оно все же сконфигурировано по уровню? Если нет, то настоятельно рекомендую. Попробуйте записать EOICR, когда поймаете "зависание" - если логика была нарушена, то после этой записи должно запустится прерывание. Еще неплохо бы проверить листинг на предмет корректности кода для вложенных прерываний.
|
|
|
|
|
May 27 2013, 22:55
|
Группа: Новичок
Сообщений: 7
Регистрация: 19-09-09
Пользователь №: 52 458

|
Цитата(aaarrr @ May 28 2013, 01:36)  Похоже: сброс внутри прерывания по записи ICCR тоже привел бы к неработающим прерываниям, но в этом случае не было бы единички в IPR. UPD: или оно все же сконфигурировано по уровню? Если нет, то настоятельно рекомендую. По уровню. Цитата(aaarrr @ May 28 2013, 01:36)  Попробуйте записать EOICR, когда поймаете "зависание" - если логика была нарушена, то после этой записи должно запустится прерывание. Да, до этого я уже додумался, но теперь надо подождать денёк, пока эта тварь снова повиснет  Цитата(aaarrr @ May 28 2013, 01:36)  Еще неплохо бы проверить листинг на предмет корректности кода для вложенных прерываний. А вложенных нету, без _nested что-то не так с вызовом процедур из обработчика было (давно было, не помню, что-то они там в один регистр с обработчиком адрес возврата запоминали что-ли...). Сейчас уже, правда, вызовов нет, ну а _nested остался, по-моему так надёжнее
|
|
|
|
Сообщений в этой теме
KITA SAM7SE застревает прерывание May 27 2013, 16:51 DmitryM Цитата(KITA @ May 27 2013, 20:51) AT91SAM... May 27 2013, 17:04 KITA В AIC_SVR[1] адрес моего обработчика. Дык в периф... May 27 2013, 17:18  DmitryM Цитата(KITA @ May 27 2013, 21:18) В AIC_... May 27 2013, 17:27   KITA Нет, FIQ не используется. May 27 2013, 17:29    DmitryM Цитата(KITA @ May 27 2013, 21:29) Нет, FI... May 27 2013, 17:37     KITA Цитата(DmitryM @ May 27 2013, 21:37) Прив... May 27 2013, 20:43 aaarrr Код*AT91C_AIC_ICCR=1<<AT91C_ID_SYS;
Если п... May 27 2013, 20:53
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|