Ну вот. Зная компилятор можно продолжать.
Цитата(Balaganoff @ Sep 18 2008, 11:52)

Использую JTAG SAM-ICE Segger + кит на AT91SAM7A3 + IAR 4.42A .
Тогда откройте окно дизассемблера и посмотрите на адрес 0x18. Там будет или что-то вроде LDR PC,[PC, #24] и тогда по адресу 0x38 будет лежать адрес обработчика, либо там будет LDR PC, [PC, #-3872] - тогда это как раз и есть чтение AIC_IVR и передача управления.
В певом случае вам надо в окне дизассемблера пролистать до адреса обработчика и посмотреть, что там находится. Если там заглушка типа "переход на себя", надо добавить в программу обработчик:
Код
#pragma vector = 0x18
__irq __arm void IRQ_Switch() {
void (*Handler)() = (void(*)())AT91C_BASE_AIC->AIC_IVR;
Handler();
AT91C_BASE_AIC->AIC_EOICR = 0; // Reset AIC logic
}
Во втором случае надо ваш обработчик объявить как __irq __arm void pio_c_irq_handler ( void ) и добавить в его конце AT91C_BASE_AIC->AIC_EOICR = 0;
В любом случае полезно добавить в программу после настройки контроллера строчку AT91C_BASE_AIC->AIC_EOICR = 0; ибо если вы находясь в обработчике прерывания нажмете иконку сброса в отладчике, сброса контроллера прерываний не происходит и прерывания с таким и более низким приоритетом останутся запрещены.
И самое главное - я не вижу в вашей программе строчки __enable_interrupt();