将数据从内存地址复制到另一个内存地址,一次752个字节

时间:2014-01-22 08:42:30

标签: c

我想将数据从内存地址复制到另一个内存地址,一次752个字节。如果没有for循环,我只能复制752个字节。我怎么一次又一次地做480次,我需要增加我的目标地址,以便所有752字节的数据一个接一个地存储在目标内存块中。我怎样才能做到这一点?这是我提出的解决方案,但它不起作用,请帮忙。谢谢。

volatile unsigned char *DAQ_BUFF = (unsigned char *)0xC6010000;
extern unsigned char *DAQ_BUFF;
unsigned char *Dest = (unsigned char *)0xC6020000;
int lv;
for(lv=0;lv<480;lv++)
{
    memcpy(Dest,DAQ_BUFF,752);

    Dest=Dest+752;
}

4 个答案:

答案 0 :(得分:1)

我注意到的四件事:

你正在使用memcpy 3次 罗兰说,你不要增加DAQ_BUFF 您正在使用memcpy(&amp; Dest,&amp; DAQ_BUFF,300);而不是memcpy(Dest,DAQ_BUFF,300);
并且Dest未初始化

unsigned char *Dest = something;  
int lv;  
for(lv = 0; lv < 480; lv++){  
    memcpy(Dest, DAQ_BUFF, 752);  
    Dest += 752;  
    DAQ_BUFF += 752;  
}  

瓦尔特

答案 1 :(得分:1)

我认为你的循环中的微小变化将满足这种情况

这是修改后的循环

volatile unsigned char *DAQ_BUFF = (unsigned char *)0xC6010000;
extern unsigned char *DAQ_BUFF;
unsigned char *Dest;
int lv,rv;

for(lv=0;lv<480;lv++)
{
    memcpy(&Dest,&DAQ_BUFF+752*lv,300);
    memcpy(&Dest+300,&DAQ_BUFF+300+752*lv,300);
    memcpy(&Dest+600,&DAQ_BUFF+600+752*lv,152);
    Dest=Dest+752;
}

答案 2 :(得分:1)

我认为以下内容应该有效,请参阅我对您的问题的评论以获得解释。你能解释一下为什么memcpy只能以300字节为单位吗?

volatile unsigned char *DAQ_BUFF = (unsigned char *)0xC6010000;
extern unsigned char *DAQ_BUFF;
unsigned char *Dest = (unsigned char *)0xC6020000;
int lv;

for(lv=0;lv<480;lv++)
{
    memcpy(Dest, DAQ_BUFF, 300);
    memcpy(Dest+300, DAQ_BUFF+300, 300);
    memcpy(Dest+600, DAQ_BUFF+600, 152);
    Dest += 752;
}

您的代码让我假设DAQ_BUFF足够大以容纳752个字节。我之所以假设这是因为没有信号/标志检查,以查看DAQ_BUFF中“下一个300”字节的数据是否“有效”。如果你确实需要检查这个,我会期望这样的事情:

for(lv=0;lv<480;lv++)
{
    while (DAQ_BUFF_DATA_IS_NOT_VALID); /* wait for DAQ data to be valid */
    memcpy(Dest, DAQ_BUFF, 300);

    /* if DAQ_BUFF can only hold 300 bytes then it must be read from the beginning again */
    while (DAQ_BUFF_DATA_IS_NOT_VALID); /* wait for DAQ data to be valid */
    memcpy(Dest+300, DAQ_BUFF, 300);

    while (DAQ_BUFF_DATA_IS_NOT_VALID); /* wait for DAQ data to be valid */
    memcpy(Dest+600, DAQ_BUFF, 152);

    Dest += 752;
}

这看起来更像是DAQ_BUFFER_SIZE为300的代码。

如果情况并非如此,并且您的DAQ_BUFFER_SIZE足够大以容纳752字节,我希望如下:

for(lv=0;lv<480;lv++)
{
    /* Do you first need to check if DAQ_BUFF-data is valid? */
    memcpy(Dest, DAQ_BUFF, 752);

    Dest += 752;
}

答案 3 :(得分:0)

int a[5] = {1,2,3,4,5}
int *p = a;
for(i=0;i<5;i++)
{
      printf("array value is %d pointer poiniting to %p ",*(p+i),p);
}

如果每次p的值都相同时运行此代码 因为你只是增加指针只添加它。修复增量,如

p = p+1;
p++;

在您的案例中,Dest和DAQ_BUFF。

注意:检查是否已正确初始化指针。(可能是代码丢失) 或者它将指向随机存储器