由ADS1.2中memcpy()想到的
作者:owzq 邮箱:owzq@163.com
在做NANDFLASH底层驱动时,由于数据量很大,想着把外部总线的时序再调紧凑一点,于是想到用memcpy()函数. NANDFLASH写函数中用 #define DEV_STORE_PIPEIO ((volatile BYTE*)0x01180000) memcpy( (BYTE*)DEV_STORE_PIPEIO, pbyData, dwSize ); 当DEV_STORE_PIPEIO地址不是4字节对齐时,数据错误. 反汇编后发现核心是ldmcsia/stmcsia,就要4字节对齐,当不对齐的时候,就凑齐. 我们仔细看反汇编的代码发现前面大量的语句都是在凑对齐. 我们可以肯定,复制数据越多,memcpy()效率越高.如果仅仅拷贝4/8个字节,还是赋值吧.呵呵. memcpy()应用于NANDFLASH这样的数据和地址不是一一对应的硬件时,要对齐.
你可以用 ldmcsia r1!,{r3,r4,r12,r14} stmcsia r0!,{r3,r4,r12,r14} ldmcsia r1!,{r3,r4,r12,r14} stmcsia r0!,{r3,r4,r12,r14} 自己打造一个专用的函数.
附录: memcpy __rt_memcpy cmp r2,#3 bls _memcpy_lastbytes ands r12,r0,#3 beq _memcpy_dest_aligned ldrb r3,[r1],#1 cmp r12,#2 add r2,r2,r12 ldrlsb r12,[r1],#1 strb r3,[r0],#1 ldrccb r3,[r1],#1 sub r2,r2,#4 strlsb r12,[r0],#1 strccb r3,[r0],#1 _memcpy_dest_aligned ands r3,r1,#3 beq __rt_memcpy_w subs r2,r2,#4 bcc _memcpy_lastbytes ldr r12,[r1,-r3]! cmp r3,#2 beq _memcpy_src2_loop bhi _memcpy_src3_loop _memcpy_src1_loop mov r3,r12,lsr #8 ldr r12,[r1,#4]! subs r2,r2,#4 orr r3,r3,r12,lsl #24 str r3,[r0],#4 bcs _memcpy_src1_loop add r1,r1,#1 b _memcpy_lastbytes _memcpy_src2_loop mov r3,r12,lsr #16 ldr r12,[r1,#4]! subs r2,r2,#4 orr r3,r3,r12,lsl #16 str r3,[r0],#4 bcs _memcpy_src2_loop add r1,r1,#2 b _memcpy_lastbytes _memcpy_src3_loop mov r3,r12,lsr #24 ldr r12,[r1,#4]! subs r2,r2,#4 orr r3,r3,r12,lsl #8 str r3,[r0],#4 bcs _memcpy_src3_loop add r1,r1,#3 b _memcpy_lastbytes __rt_memcpy_w stmfd r13!,{r4,r14} subs r2,r2,#0x20 bcc _memcpy_small _memcpy_aligned_loop ldmcsia r1!,{r3,r4,r12,r14} stmcsia r0!,{r3,r4,r12,r14} ldmcsia r1!,{r3,r4,r12,r14} stmcsia r0!,{r3,r4,r12,r14} subcss r2,r2,#0x20 bcs _memcpy_aligned_loop _memcpy_small movs r12,r2,lsl #28 ldmcsia r1!,{r3,r4,r12,r14} stmcsia r0!,{r3,r4,r12,r14} ldmmiia r1!,{r3,r4} stmmiia r0!,{r3,r4} ldmfd r13!,{r4,r14} movs r12,r2,lsl #30 ldrcs r3,[r1],#4 strcs r3,[r0],#4 moveq pc,r14 _memcpy_lastbytes movs r2,r2,lsl #31 ldrmib r2,[r1],#1 ldrcsb r3,[r1],#1 ldrcsb r12,[r1],#1 strmib r2,[r0],#1 strcsb r3,[r0],#1 strcsb r12,[r0],#1 mov pc,r14
|