реклама на сайте
подробности

 
 
> Сохранение регистров в Си-обработчике прерывания (Cortex-M3)
Harvester
сообщение Mar 27 2016, 12:24
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 338
Регистрация: 1-02-06
Из: Королев, М.О.
Пользователь №: 13 846



Добрый день.
В наследство достался код под 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 требовали ручного сохранения регистров? Никто с таким не встречался?


--------------------
-Да как так-то?/-Да как-то так/-Ну так-то да
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 22:40
Рейтинг@Mail.ru


Страница сгенерированна за 0.01337 секунд с 7
ELECTRONIX ©2004-2016