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

 
 
> Сохранение регистров в Си-обработчике прерывания (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
 
Start new topic
Ответов (1 - 3)
aaarrr
сообщение Mar 27 2016, 13:30
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Harvester @ Mar 27 2016, 15:24) *
А с другой стороны, зачем-то это было написано? Может какие-то версии GNU C требовали ручного сохранения регистров?

Сомнительно: тогда такое же ручное сохранение требовалось бы вообще в любой процедуре, а не только в обработчике прерывания.
Go to the top of the page
 
+Quote Post
HardEgor
сообщение Mar 27 2016, 15:51
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 223
Регистрация: 3-03-06
Из: Tomsk
Пользователь №: 14 925



Возможно в _proc_int_handler() идут какие-то манипуляции с регистрами.
А возможно разработчик хотел что-то проверить и забыл убрать.
Go to the top of the page
 
+Quote Post
Harvester
сообщение Mar 27 2016, 16:57
Сообщение #4


Местный
***

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



Цитата(HardEgor @ Mar 27 2016, 18:51) *
Возможно в _proc_int_handler() идут какие-то манипуляции с регистрами.

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

Наверное, придется принять этот вариант, т.к. никаких объективных причин для такого финта я не вижу.


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

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

 


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


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