之前有做avin优化,降低cpu的使用率时。有自己用arm汇编来实现一个内存拷贝的函数,主要是用来替换原来驱动程序中memcpy函数。现在将源码贴在这里,怕自己以后遗忘。呵呵。
1.知识要点:
arm汇编
arm体系架构下的apcs
vs2005的编译器不支持内嵌汇编,但可以编译arm汇编文件,生成obj文件。
2.源代码:
因为这个函数是为avin驱动专门写的,所以这个现在只支持长度是4字节倍数的拷贝。
函数原型:void _avin_memcpy(unsigned char* dst,unsigned char *src,unsigned int length);
;;benson_20110315 modify for avin T_fpga_fw
INCLUDE kxarm.h
TEXTAREA
LEAF_ENTRY _avin_memcpy
stmfd sp!, {r4 - r11}
and r3,r2,#31
mov r2,r2,LSR #5
cmp r2,#0
beq %F2
1
ldmia r1!, {r4 - r11}
stmia r0!, {r4 - r11}
subs r2, r2, #1
bne %B1
2
add pc, pc, r3
b MEMCPY_END ;0*4
b MEMCPY4 ;1*4
b MEMCPY8 ;2*4
b MEMCPY12 ;3*4
b MEMCPY16 ;4*4
b MEMCPY20 ;5*4
b MEMCPY24 ;6*4
b MEMCPY28 ;7*4
MEMCPY28
ldmia r1!,{r4 - r10}
stmia r0!,{r4 - r10}
b MEMCPY_END
MEMCPY24
ldmia r1!,{r4 - r9}
stmia r0!,{r4 - r9}
b MEMCPY_END
MEMCPY20
ldmia r1!,{r4 - r8}
stmia r0!,{r4 - r8}
b MEMCPY_END
MEMCPY16
ldmia r1!,{r4 - r7}
stmia r0!,{r4 - r7}
b MEMCPY_END
MEMCPY12
ldmia r1!,{r4 - r6}
stmia r0!,{r4 - r6}
b MEMCPY_END
MEMCPY8
ldmia r1!,{r4 - r5}
stmia r0!,{r4 - r5}
b MEMCPY_END
MEMCPY4
ldmia r1!,{r4}
stmia r0!,{r4}
b MEMCPY_END
MEMCPY_END
ldmfd sp!, {r4 - r11}
IF Interworking :LOR: Thumbing
bx lr ; Return with Thumb mode
ELSE
mov pc, lr ; Return
ENDIF
END
阅读(1717) | 评论(0) | 转发(0) |