|
发表于 2011-9-19 18:00:19
|
显示全部楼层
我先来个我今天刚写的,基于软中断,还没有没有验证
1)OS侧:添加SWI中断处理函数,主要代码如下
_start:
ldr pc,=reset
ldr pc,=undefined_instruction
ldr pc,=software_interrupt
ldr pc,=prefetch_abort
ldr pc,=data_abort
ldr pc,=reserved
ldr pc,=irq
ldr pc,=fiq
......................................
software_interrupt:
get_swi_stack
swi_save_user_registers
ldr lr,=ret
ldr pc,=do_system_call
ret: swi_load_user_registers
......................................
.macro get_swi_stack
ldr sp, =SVC_STACK_BASE
.endm
.macro swi_save_user_registers
sub sp, sp,#SVC_STACK_FRAME_SIZE
stmia sp, {r0-r12}
add r8, sp, #52
stmia r8!, {sp,lr}^
str lr, [r8]
mrs r6, spsr
str r6, [r8,#4]
mov r0, sp //至此r0可以作为参数指针传递,后面可以看到系统API都是一个结构体类型的参数,而R0即为结构体首地址
.endm
.macro swi_load_user_registers
ldmia sp, {r0-lr}^
ldr lr, [sp,#60]
add sp, sp,#SVC_STACK_FRAME_SIZE
movs pc, lr
.endm
....................................................
void do_system_call(struct cpu_registers *regs)
{
unsigned int callnum;
callnum = regs->r0
fun_ptr fun; //函数指针
fun=sys_call_table[callnum];
regs->r0=(*fun)(regs);//返回值
}
......................................................
typedef int(* fun_ptr)(struct cpu_registers *regs);
fun_ptr sys_call_table[] = {
sys_hello,sys_fork
};
int sys_hello(struct cpu_registers *regs)
{
printk("hello word\n");
return 0;
}
int sys_fork(struct cpu_registers *regs)
{
printk("fork\n");
return 0;
}
..........................................
...........................................
中间层SDK:
#define NR_hello 0
#define NR_fork 1
定义无参数函数调用形式type:返回值类型,name 函数名
#define system_call0(type,name) \
type name()\
{\
unsigned int res;\
unsigned int fun_id=NR_##name;\
asm volatile(\
"ldr r0,%1 \n\t"\
"swi \n\t"\
"str r0,%0 \n\t"\
:"=m"(res)\
:"m"(fun_id)\
:"r0","memory"\
);\
return (type)res;\
}
定义1个参数函数调用形式。type 返回值类型,name函数名,atype:参数a类型,a参数值
#define system_call1(type,name,atype,a) \
type name(atype a)\
{\
unsigned int res;\
unsigned int fun_id=NR_##name;\
asm volatile(\
"ldr r0,%1 \n\t"\
"ldr r1,%2 \n\t"\
"swi \n\t"\
"str r0,%0 \n\t"\
:"=m"(res)\
:"m"(fun_id),"m"(a)\
:"r0","r1","memory"\
);\
return (type)res;\
}
....................................
...................................
APP侧调用 system_call0(int,hello)
system_call0(int,fork)
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
完毕 |
|