roboforum.ru

Технический форум по робототехнике.
Текущее время: 26 ноя 2024, 21:32

Часовой пояс: UTC + 4 часа




Начать новую тему Ответить на тему  [ Сообщений: 3 ] 
Автор Сообщение
 Заголовок сообщения: Вызов SWI функции из Си в GCC ARM
СообщениеДобавлено: 19 май 2008, 12:45 
Не в сети

Зарегистрирован: 19 ноя 2006, 20:15
Сообщения: 38
Откуда: Мытищи
В общем стоит следующая проблема: в компиляторе GCC требуется вызвать SWI-функцию с номером. Функция написана, обработчик SWI-написан и функционирует. Надо, чтобы была функция, допустим syscall(), т.е. когда я напишу в Си коде
Код:
syscall()
, то компилятор сделает:
Код:
SWI 0x123
, где 0x123 номер программного прерывания.

Пока есть следующие решения:
1) Через ассемблерную вставку вида:
Код:
#define syscall()                              \
      asm volatile(                           \
         "swi #0x123"       "\r\n"               \
         : : :                              \
      )

2) Объявление в *.asm функции:
Код:
syscall:
         str SP!,{LR}
         swi 0x123
         ldr SP!,{PC}

И заголовочного файла:
Код:
void syscall(void);


Недостатки:
У первого: при вызове функции с параметрами в макрос добавляются строки mov r0, %1 и т.д. по кол-ву параметров и идут лишние перетасовки между регистрами. GCC не может оптимизировать такой вызов.
У второго: в код вставляется вызов функции на ассемблере:
Код:
BL syscall

И только после перехода по адресу идет вызов swi. Накладные расходы: 3 лишние команды, плюс 4 байта стека на возврат.

Так что вопрос: возможно ли что-то аналогичное Realview MDK:
Код:
void __swi(0x123) syscall(void);

???


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вызов SWI функции из Си в GCC ARM
СообщениеДобавлено: 21 июн 2008, 01:19 
Не в сети

Зарегистрирован: 19 ноя 2006, 20:15
Сообщения: 38
Откуда: Мытищи
В итоге реализовал патчером.
В скрипте линкера объявляю специфичные метки с недопустимыми адресами, а потом получившиеся "кривые" BL инструкции
заменяю на соответствующие номерные SWI. Работает :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вызов SWI функции из Си в GCC ARM
СообщениеДобавлено: 27 авг 2008, 10:54 
Не в сети

Зарегистрирован: 27 авг 2008, 10:45
Сообщения: 1981
Откуда: Харьков
прог. языки: С/С++
Не совсем понял - что не так с первым вариантом (asm volatile() ). У меня на предыдущей работе был арм-проект на LPC - все системные вызовы были объявлены макросами через asm, лишнего вроде ничего не замечал. А если вызов требует аргументов - то они же в любом случае привязаны к регистрам, так что вроде без перемещений компилятору в общем случае не обойтись. Или я чего-то не заметил?


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 3 ] 

Часовой пояс: UTC + 4 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 15


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
phpBB SEO