打印

由ADS1.2中memcpy()想到的

[复制链接]
3618|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
owzq|  楼主 | 2007-4-24 20:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
由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

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

4

帖子

0

粉丝