Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
尝试对由mmap()生成的指针使用memcpy()时出现c-总线错误_C - Fatal编程技术网

尝试对由mmap()生成的指针使用memcpy()时出现c-总线错误

尝试对由mmap()生成的指针使用memcpy()时出现c-总线错误,c,C,我在尝试在ARM上运行交叉编译代码时遇到一个“总线错误”,我将其追溯到: int * arr; arr = (int *)malloc(BUF*sizeof(int)); memcpy(arr,&cha_signal[trig_ptr],BUF*sizeof(int)); trig_ptr是一个整数,指向信号开始的位置;BUF缓冲区的大小(~16000) 没有意义的是,如果我手动循环通过chau信号,使用 for(i=0; i < BUF;

我在尝试在ARM上运行交叉编译代码时遇到一个“总线错误”,我将其追溯到:

    int * arr;
    arr = (int *)malloc(BUF*sizeof(int));       

    memcpy(arr,&cha_signal[trig_ptr],BUF*sizeof(int));
trig_ptr是一个整数,指向信号开始的位置;BUF缓冲区的大小(~16000)

没有意义的是,如果我手动循环通过chau信号,使用

for(i=0; i < BUF; i++) { //do stuff }

有什么想法吗?我注意到另一个家伙也有类似的问题,但在那里,他试图写的空间,而不是;没有分配。我相信我在这里的分配是正确的

我怀疑您对
memcpy
的实现与您的硬件的读取方式不兼容。

这对于那些在
mmap
的另一端实现任何FPGA外围设备的“硬件人员”来说可能是个问题

因为您似乎正在访问硬件寄存器,而不仅仅是普通的旧内存,所以您必须按照不同的规则进行操作。某些硬件要求您按字节、字或其他涉及对齐的规则访问内存

问题的另一部分是,您不知道
memcpy
实际上是如何实现的。通常情况下,它是一个经过精心设计、高度优化的版本,在给定对齐约束的情况下,它尝试以尽可能大的单位移动数据。可能是这个优化版本导致了您的问题。可以使用标准的
for
循环进行迭代,这一事实证实了这一理论


最好的方法是在调试器下运行应用程序,逐步通过
memcpy
,查看从内存中实际读取的内容导致“总线错误”的位置。

我会打印出
&chau信号[trig\u ptr]
BUF*sizeof(int))
的值。验证前一个是4字节对齐的,并且两个字节的总和没有超过FPGA内存区域的末尾。如果您显示更多的代码,这将很有帮助。。显然,
cha_信号
的类型为
int**
void**
(否则,您发布的最后一行将不起作用),因此
cha_信号[trig\u ptr]
将是
int*
void*
,但随后您将该指针复制到
int
@user2022444的数组中,您是否解决了这个问题?我很想知道我的回答是否真的描述了你遇到的问题。
/* Map FPGA memory space to page_ptr. */
page_ptr = mmap(NULL, OSC_FPGA_BASE_SIZE, PROT_READ | PROT_WRITE,
                      MAP_SHARED, g_osc_fpga_mem_fd, page_addr);
if((void *)page_ptr == MAP_FAILED) {
   //cleanup code
}

/* Set FPGA OSC module pointers to correct values. */
g_osc_fpga_reg_mem = page_ptr + page_off;
g_osc_fpga_cha_mem = (uint32_t *)g_osc_fpga_reg_mem + 
    (OSC_FPGA_CHA_OFFSET / sizeof(uint32_t));

...

*cha_signal = (int *)g_osc_fpga_cha_mem;