Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Сохранение регистров в Си-обработчике прерывания (Cortex-M3)
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
Harvester
Добрый день.
В наследство достался код под 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 требовали ручного сохранения регистров? Никто с таким не встречался?
aaarrr
Цитата(Harvester @ Mar 27 2016, 15:24) *
А с другой стороны, зачем-то это было написано? Может какие-то версии GNU C требовали ручного сохранения регистров?

Сомнительно: тогда такое же ручное сохранение требовалось бы вообще в любой процедуре, а не только в обработчике прерывания.
HardEgor
Возможно в _proc_int_handler() идут какие-то манипуляции с регистрами.
А возможно разработчик хотел что-то проверить и забыл убрать.
Harvester
Цитата(HardEgor @ Mar 27 2016, 18:51) *
Возможно в _proc_int_handler() идут какие-то манипуляции с регистрами.

Да вроде ничего криминального: просто читается регистр PSR и сохраняется в глобальной переменной.
Цитата(HardEgor @ Mar 27 2016, 18:51) *
А возможно разработчик хотел что-то проверить и забыл убрать.

Наверное, придется принять этот вариант, т.к. никаких объективных причин для такого финта я не вижу.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.