1、 memcpy函数的实现方式
void m_memcpy(void *pdest,const void *psrc,uint32_t size)
{
#define DEF_NO 0u
#define DEF_YES 1u
uint32_t size_rem;
uint32_t mem_gap_octets;
uint32_t *pmem_align_dest;
const uint32_t *pmem_align_src;
uint8_t *pmem_08_dest;
const uint8_t *pmem_08_src;
uint32_t i;
uint32_t mem_align_mod_dest;
uint32_t mem_align_mod_src;
uint8_t mem_aligned;
if (size < 1)return;
if (pdest == (void*)0)return;
if (psrc == (void*)0)return;
size_rem = size;
pmem_08_dest = ( uint8_t *)pdest;
pmem_08_src = (const uint8_t *)psrc;
mem_gap_octets = pmem_08_src - pmem_08_dest;
if (mem_gap_octets >= sizeof(uint32_t))//避免buf重叠
{
mem_align_mod_dest = (uint8_t)((uint32_t)pmem_08_dest % sizeof(uint32_t));
mem_align_mod_src = (uint8_t)((uint32_t)pmem_08_src % sizeof(uint32_t));
mem_aligned = (mem_align_mod_dest == mem_align_mod_src) ? DEF_YES : DEF_NO;
if ( mem_aligned == DEF_YES )
{
if (mem_align_mod_dest != 0)
{
i = mem_align_mod_dest;
while( size_rem>0 && i<sizeof(uint32_t) )
{
*pmem_08_dest++ = *pmem_08_src++;
size_rem -= sizeof(uint8_t);
i++;
}
}
//------4字节对齐后---------------------------------------
pmem_align_dest = ( uint32_t *)pmem_08_dest;
pmem_align_src = (const uint32_t *)pmem_08_src;
while (size_rem >= sizeof(uint32_t)) //4字节的复制
{
*pmem_align_dest++ = *pmem_align_src++;
size_rem -= sizeof(uint32_t);
}
pmem_08_dest = ( uint8_t *)pmem_align_dest;
pmem_08_src = (const uint8_t *)pmem_align_src;
}
}
//复制剩余的字节
while (size_rem > 0)
{
*pmem_08_dest++ = *pmem_08_src++;
size_rem -= sizeof(uint8_t);
}
}
2、 测试
uint8_t test1_buf[1024],test2_buf[1024];
memset(test1_buf,0,sizeof(test1_buf));
memset(test2_buf,0,sizeof(test2_buf));
m_memcpy(test1_buf,test2_buf,sizeof(test2_buf));
if ( 0 == memcmp(test1_buf,test2_buf,sizeof(test2_buf)))
{
PRINTF_HEAP_MEM("m_memcpy function ok\n");
}