由ADS1.2中memcpy()想到的

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

本版积分规则

2

主题

4

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部