【问题标题】:copy data from a memory address to another memory address, 752 bytes at a time将数据从一个内存地址复制到另一个内存地址,一次 752 字节
【发布时间】:2014-02-12 05:17:29
【问题描述】:

我想将数据从一个内存地址复制到另一个内存地址,一次 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;
}

【问题讨论】:

  • 你似乎没有前进DAQ_BUFF
  • 目标内存指向哪里??
  • 为什么要分三部分抄?请缩进您的代码,这看起来很糟糕(部分原因是您不应该使用 TAB)。
  • 你真的应该研究一些关于指针和引用的基础知识。您的变量 Dest 已经是一个指针。您的变量 DAQ_BUFF 也是如此。由于memcpy 需要一个指向 Destionation 和 Source 的指针,因此不需要对它们使用引用运算符。你实际上将char** 传递给memcpy...
  • 首先感谢大家帮助我。是的,DAQ_BUFF 中的数据是从 FPGA(feild 可编程门阵列)读取的,我无法增加 DAQ_BUFF,因为从 fpga 传输到 dsp(数字信号处理器)的字节有限,即 acnt 受到限制。是否可以不增加 DAQ_BUFF 而只增加 Dest 以一次又一次地将相同的 DAQ_BUFF 数据存储到 Dest 中?

标签: c


【解决方案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;
}

【讨论】:

    【解决方案2】:

    我认为你的循环中的小改变会满足这种情况

    这是修改后的循环

    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;
    }
    

    【讨论】:

    • *Dest 仍未初始化,导致未定义的行为(可能初始化为 *0,EG NULL 指针)
    • 你是对的。但这不是所提出的问题。我猜代码是从大文件中剥离出来的。
    • 你为什么要给 &DAG_BUFF 添加 +752?
    【解决方案3】:

    我注意到的四件事:

    您正在使用 memcpy 3 次
    您不会像 Rowland 所说的那样增加 DAQ_BUFF
    您正在使用 memcpy(&Dest,&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;  
    }  
    

    变态

    【讨论】:

    • DAQ_BUFF 可能没有递增,因为它指向硬件 FIFO,因此后续读取会得到不同的数据。
    • 但他什么也没说。我们应该怎么知道。
    • 这个 DAQ 缓冲区甚至可能只有 300 字节大(在(可能)微控制器/小型处理器上并不罕见)
    • 确实如此。当我看到(unsigned char *)0xC6010000 时,我首先想到的是嵌入式系统、汇编等。
    • 首先感谢大家帮助我。是的,DAQ_BUFF 中的数据是从 FPGA(feild 可编程门阵列)读取的,我无法增加 DAQ_BUFF,因为从 fpga 传输到 dsp(数字信号处理器)的字节有限,即 acnt 受到限制。是否可以不增加 DAQ_BUFF 而只增加 Dest 以一次又一次地将相同的 DAQ_BUFF 数据存储到 Dest 中?
    【解决方案4】:
    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。

    注意:检查您是否正确初始化了指针。(可能是代码丢失) 否则它会指向随机内存

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多