Добрый день.
В наследство достался код под GNU C, который хочу перевести в Keil.
В одном из обработчиков прерываний имеются следующие строки:
Код
void USB0_IRQHandler (void)
{
__asm("push {r4-r11}");
_proc_int_handler();
...
irq_exit:;
__asm("pop {r4-r11}");
}
Компилятор GNU C это воспринимает нормально, а Keil выдает ошибку
"error: #1161: Cannot directly modify the stack pointer SP (r13)"
С одной стороны, я знаю, что компилятор должен сам сохранять все задействованные в обработчике регистры. И листинг это подтверждает:
Код
827 USB0_IRQHandler:
828 @ args = 0, pretend = 0, frame = 0
829 @ frame_needed = 0, uses_anonymous_args = 0
830 0000 2DE9F84F push {r3, r4, r5, r6, r7, r8, r9, r10, fp, lr}
831 .syntax unified
832 @ 653 "./../src/usbhw.c" 1
833 0004 2DE9F00F push {r4-r11}
834 @ 0 "" 2
835 .thumb
836 .syntax unified
837 0008 FFF7FEFF bl _proc_int_handler
А с другой стороны, зачем-то это было написано? Может какие-то версии GNU C требовали ручного сохранения регистров? Никто с таким не встречался?