Tcom 0 8 июля, 2008 Опубликовано 8 июля, 2008 · Жалоба Генерится непрерывно прерывание по приёму байта, по форуму искал... Инициализация AT91C_BASE_SYS->PIOA_IDR = 0xffffffff; // AT91C_BASE_US0->US_IER = AT91C_US_RXRDY; //* Disable the interrupt on the interrupt controller AT91C_BASE_AIC->AIC_IDCR = 1<<AT91C_ID_US0; //* Save the interrupt handler routine pointer and the interrupt priority AT91C_BASE_AIC->AIC_SVR[AT91C_ID_US0] = (unsigned int) RX_interrapt; //* Store the Source Mode Register AT91C_BASE_AIC->AIC_SMR[AT91C_ID_US0] = AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL | 2 ; //* Clear the interrupt on the interrupt controller AT91C_BASE_AIC->AIC_ICCR = 1<<AT91C_ID_US0; AT91C_BASE_AIC->AIC_IECR = 0x1 << AT91C_ID_US0; Обработчик void RX_interrapt (void) { status = AT91C_BASE_US0->US_CSR; status = AT91C_BASE_US0->US_RHR; AT91C_BASE_US0->US_CR = AT91C_US_RSTSTA; AT91C_BASE_SYS->AIC_EOICR = 0; } Срабатывание прерывания проверял брекпоинтом, если убрать брекпоинт, нажать на паузу - продолжить то программа улетает в __data_handler: ldr pc,[pc,#+24] ;; Data abort Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 68 8 июля, 2008 Опубликовано 8 июля, 2008 · Жалоба AT91C_BASE_AIC->AIC_SVR[AT91C_ID_US0] = (unsigned int) RX_interrapt; ... void RX_interrapt (void) А где оформление процедуры как irq? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tcom 0 8 июля, 2008 Опубликовано 8 июля, 2008 · Жалоба __irq void RX_interrapt (void) так? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 68 8 июля, 2008 Опубликовано 8 июля, 2008 · Жалоба Это от компилятора зависит. Для Keil/RVDS так. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tcom 0 8 июля, 2008 Опубликовано 8 июля, 2008 · Жалоба У меня IAR, выковырял этот код их екземпла IAR. Почемуто он так вот неправельно рабтает. Когда подаю питание на девайс и запускаю отлатку,прерывания генерятся. потом останавливаю редактирую код, не связаный с переываниями, запускаю отладку, все перерывания не работают. Как лечить?Не дёргать жеш питание каждый раз. __irq void RX_interrapt (void) эффект равен 0 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 68 8 июля, 2008 Опубликовано 8 июля, 2008 · Жалоба Когда подаю питание на девайс и запускаю отлатку,прерывания генерятся. потом останавливаю редактирую код, не связаный с переываниями, запускаю отладку, все перерывания не работают. Как лечить?Не дёргать жеш питание каждый раз. Так у Вас одна проблема или много? В первом посте пишите, что постоянно генерируется прерывание по приему USART, а теперь что прерывания не работают после остановки отладки. __irq void RX_interrapt (void) эффект равен 0 Для IAR'а, как я понимаю, слово то же самое. Эффект не может быть равен 0, так как один из вариантов неправильный. После вектора у Вас процессор куда попадает? Сразу читает AIC, или есть еще один обработчик? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tcom 0 8 июля, 2008 Опубликовано 8 июля, 2008 · Жалоба Так у Вас одна проблема или много? Может проблеммы 2, я просто описал состояние в которм находится железо, может это подтолкнёт к решению моей проблемы. Эффект не может быть равен 0, так как один из вариантов неправильный. После вектора у Вас процессор куда попадает? Сразу читает AIC, или есть еще один обработчик? Вектор один, перывание попадает на обработчик. Это я проверял пошаговым выполнением. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 68 8 июля, 2008 Опубликовано 8 июля, 2008 · Жалоба Вектор один, перывание попадает на обработчик. Это я проверял пошаговым выполнением. То есть по адресу вектора (0x18) стоит команда ldr pc, [pc, #-0xf20]? Тогда модификатор __irq для обработчиков нужен обязательно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tcom 0 8 июля, 2008 Опубликовано 8 июля, 2008 · Жалоба То есть по адресу вектора (0x18) стоит команда ldr pc, [pc, #-0xf20]? Тогда модификатор __irq для обработчиков нужен обязательно. поставил, ничего не изменилось :smile3046: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 68 8 июля, 2008 Опубликовано 8 июля, 2008 · Жалоба поставил, ничего не изменилось :smile3046: А зачем поставили и что стояло? Вы в курсе организации системы прерываний у ARM7TDMI и SAM7? Так можно долго блуждать в потемках. Что касается работы под отладчиком, то убедитесь, что он не считывает во время остановки регистры периферии - эффекты от этого могут быть самые разные. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Andry333 0 18 июля, 2008 Опубликовано 18 июля, 2008 (изменено) · Жалоба Хм.. странно, никогда не использовал модификатор __irq и все работал.. а зачем он нужен? объясните плиз.. Изменено 18 июля, 2008 пользователем Andryha Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
meister 0 18 июля, 2008 Опубликовано 18 июля, 2008 · Жалоба Хм.. странно, никогда не использовал модификатор __irq и все работал.. Вероятно, у Вас пролог и эпилог прерывания от операционки (FreeRTOS, например). а зачем он нужен? объясните плиз.. Чтобы компилятор правильно генерировал пролог и эпилог функции, а так же генерировал код в режиме ARM. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться