Цитата(SpiritDance @ Aug 21 2006, 16:17)

.. кто нибудь пробовал сишную функцию запихнуть в swi?
Я делал. Инициализирую таблицу адресов системных функций. При вызове swi, которая у меня выглядит
#define SysCall_0() asm volatile ("swi #0")
#define SysCall_1() asm volatile ("swi #1")
#define SysCall_2() asm volatile ("swi #2")
#define SysCall_3() asm volatile ("swi #3")
.....
в вызывающей функции например SysCall_0();
далее обработчик програмго прерывания определяет адрес системной функции и вызывает ее, даллее возвращает управление
Код
#include "SwiHandlers.h"
//массив адресов системных функций
volatile SWIHANDLER SwiHandlers[SWI_HANDLERS];
volatile TSwiData SwiData;
//-----------------------------------------------
void swiHandler_0()
{
}
//-----------------------------------------------
void swiHandler_1()
{
//
}
//-----------------------------------------------
void swiHandler_2()
{
//
}
//-----------------------------------------------
void swiHandler_3()
{
//
}
//-----------------------------------------------
void InitSWIHandlers()
{
SwiHandlers[0] = swiHandler_0;
SwiHandlers[1] = swiHandler_1;
SwiHandlers[2] = swiHandler_2;
SwiHandlers[3] = swiHandler_3;
}
void Swi_Handler(void) __attribute__((interrupt("SWI")));
void Swi_Handler(void)
{
// вызов системной функции
asm volatile ( "mov r0 , r14 ; \
sub r0 , #0x4 ; \
ldr r0 , [r0] ; \
bic r0 , #0xff000000; \
mov r1 , #0x4 ; \
mul r0 , r1 ; \
mov r1 , %0 ; \
add r0 , r1 ; \
ldr r0 , [r0] ; \
mov lr, pc ;\
bx r0"
:
: "r"(SwiHandlers)
: "r0", "r1"
);
}
код