Как вам мой свежий взгляд на проблему? Ни строчки на ассемблере! И
заработало в железе. void __attribute__ ((interrupt)) USARTISR (void) { //ОПРЕДЕЛЕНИЕ ФАКТИЧЕСКОГО ОБРАБОТЧИКА ПРЕРЫВАНИЯ
//ТУТ КОД СИ МОЕГО ОБРАБОТЧИКА ПРЕРЫВАНИЯ
}
void __attribute__ ((naked)) USART1_IRQHandler (void) { //ОПРЕДЕЛЕНИЕ ГОЛОГО ПРЕ-ПРОЛОГА ПО ВЕКТОРУ ПРЕРЫВАНИЯ
//ТУТ МОЙ ГОЛЫЙ ПРЕ-ПРОЛОГ
goto *&USARTISR;
}
АССЕМБЛЕР:
00000f48 g F .text 0000023a USARTISR
00001304 g F .text 00000020 USART1_IRQHandler
00001304 <USART1_IRQHandler>:
ТУТ МОЙ ГОЛЫЙ ПРЕ-ПРОЛОГ. УРА!
ПЕРЕХОД НА ПОЛНЫЙ ОБРАБОТЧИК
131e: 0747a783 lw a5,116(a5) # 20000074 <FuncAddr>
1322: 8782 jr a5
00000f48 <USARTISR>:
АВТОМАТИЧЕСКИЙ ПРОЛОГ. УРА!
f48: 715d addi sp,sp,-80
f4a: d03e sw a5,32(sp)
f4c: 400147b7 lui a5,0x40014
f50: d23a sw a4,36(sp)
f52: de22 sw s0,60(sp)
f54: 80078713 addi a4,a5,-2048 # 40013800 <_eusrstack+0x20011000>
f58: 20000437 lui s0,0x20000
f5c: 8007d783 lhu a5,-2048(a5)
f60: dc26 sw s1,56(sp)
f62: 2346 lhu s1,4(a4)
f64: 42042703 lw a4,1056(s0) # 20000420 <SerialState>
f68: d436 sw a3,40(sp)
f6a: c686 sw ra,76(sp)
f6c: c496 sw t0,72(sp)
f6e: c29a sw t1,68(sp)
f70: c09e sw t2,64(sp)
f72: da2a sw a0,52(sp)
f74: d82e sw a1,48(sp)
f76: d632 sw a2,44(sp)
f78: ce42 sw a6,28(sp)
f7a: cc46 sw a7,24(sp)
f7c: ca4a sw s2,20(sp)
f7e: c872 sw t3,16(sp)
f80: c676 sw t4,12(sp)
f82: c47a sw t5,8(sp)
f84: c27e sw t6,4(sp)
ТУТ МОЙ КОД ОБРАБОТЧИКА ПРЕРЫВАНИЯ
АВТОМАТИЧЕСКИЙ ЭПИЛОГ:
10cc: 5472 lw s0,60(sp)
10ce: 40b6 lw ra,76(sp)
10d0: 42a6 lw t0,72(sp)
10d2: 4316 lw t1,68(sp)
10d4: 4386 lw t2,64(sp)
10d6: 54e2 lw s1,56(sp)
10d8: 5552 lw a0,52(sp)
10da: 55c2 lw a1,48(sp)
10dc: 5632 lw a2,44(sp)
10de: 56a2 lw a3,40(sp)
10e0: 5712 lw a4,36(sp)
10e2: 5782 lw a5,32(sp)
10e4: 4872 lw a6,28(sp)
10e6: 48e2 lw a7,24(sp)
10e8: 4952 lw s2,20(sp)
10ea: 4e42 lw t3,16(sp)
10ec: 4eb2 lw t4,12(sp)
10ee: 4f22 lw t5,8(sp)
10f0: 4f92 lw t6,4(sp)
10f2: 6161 addi sp,sp,80
А ВОТ И КОРРЕКТНЫЙ ВОЗВРАТ!
10f4: 30200073 mret