- Код: Выделить всё
syscall()
- Код: Выделить всё
SWI 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);
???