Не понятен момент описания прерываний. Точнее описывать их получается, но вот поведение линковщика неоднозначно.
К примеру имеем main.c в котором скопом весь код программы в том числе и прерывания:
Код
void main(void)
{
бла бла бла
}
UART0_ISR()
{
обработчик
}
{
бла бла бла
}
UART0_ISR()
{
обработчик
}
Теперь собираем его, и получаем примерно следующее:
Код
563;--------------------------------------------------------
564; interrupt vector
565;--------------------------------------------------------
566 .area HOME (CODE)
000000 567 __interrupt_vect:
000000 02 00 29 [24] 568 ljmp __sdcc_gsinit_startup
000003 32 [24] 569 reti
000004 570 .ds 7
00000B 32 [24] 571 reti
00000C 572 .ds 7
000013 32 [24] 573 reti
000014 574 .ds 7
00001B 32 [24] 575 reti
00001C 576 .ds 7
000023 02 01 C9 [24] 577 ljmp _isr_uart
578;--------------------------------------------------------
579; global & static initialisations
580;--------------------------------------------------------
564; interrupt vector
565;--------------------------------------------------------
566 .area HOME (CODE)
000000 567 __interrupt_vect:
000000 02 00 29 [24] 568 ljmp __sdcc_gsinit_startup
000003 32 [24] 569 reti
000004 570 .ds 7
00000B 32 [24] 571 reti
00000C 572 .ds 7
000013 32 [24] 573 reti
000014 574 .ds 7
00001B 32 [24] 575 reti
00001C 576 .ds 7
000023 02 01 C9 [24] 577 ljmp _isr_uart
578;--------------------------------------------------------
579; global & static initialisations
580;--------------------------------------------------------
Теперь "причёсываем" код. Создаём uart.c и переносим в него прерывание. собираем. Линкуем.
Код
526;--------------------------------------------------------
527; interrupt vector
528;--------------------------------------------------------
529 .area HOME (CODE)
000000 530 __interrupt_vect:
000000 02 00 06 [24] 531 ljmp __sdcc_gsinit_startup
532;--------------------------------------------------------
533; global & static initialisations
534;--------------------------------------------------------
527; interrupt vector
528;--------------------------------------------------------
529 .area HOME (CODE)
000000 530 __interrupt_vect:
000000 02 00 06 [24] 531 ljmp __sdcc_gsinit_startup
532;--------------------------------------------------------
533; global & static initialisations
534;--------------------------------------------------------
А где?!

Нет, сама функция собирается, но как обычная:
Код
560;--------------------------------------------------------
561; code
562;--------------------------------------------------------
563 .area CSEG (CODE)
564;------------------------------------------------------------
565;Allocation info for local variables in function '_isr_uart'
566;------------------------------------------------------------
567; uart.c:41: _ISR_UART()
568; -----------------------------------------
569; function _isr_uart
570; -----------------------------------------
0000D8 571 _isr_uart:
00000F 572 ar7 = 0x0F
00000E 573 ar6 = 0x0E
00000D 574 ar5 = 0x0D
00000C 575 ar4 = 0x0C
00000B 576 ar3 = 0x0B
00000A 577 ar2 = 0x0A
000009 578 ar1 = 0x09
000008 579 ar0 = 0x08
561; code
562;--------------------------------------------------------
563 .area CSEG (CODE)
564;------------------------------------------------------------
565;Allocation info for local variables in function '_isr_uart'
566;------------------------------------------------------------
567; uart.c:41: _ISR_UART()
568; -----------------------------------------
569; function _isr_uart
570; -----------------------------------------
0000D8 571 _isr_uart:
00000F 572 ar7 = 0x0F
00000E 573 ar6 = 0x0E
00000D 574 ar5 = 0x0D
00000C 575 ar4 = 0x0C
00000B 576 ar3 = 0x0B
00000A 577 ar2 = 0x0A
000009 578 ar1 = 0x09
000008 579 ar0 = 0x08
Что я могу сделать не так? Это что получается прерывания должны быть только в основном коде?