В общем стоит следующая проблема: в компиляторе 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);
???