尝试对由mmap()生成的指针使用memcpy()时出现c-总线错误
我在尝试在ARM上运行交叉编译代码时遇到一个“总线错误”,我将其追溯到:尝试对由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;
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;