gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 02:03:32 26 4
gpt4 key购买 nike

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

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

memcpy(arr,&cha_signal[trig_ptr],BUF*sizeof(int));

trig_ptr 是一个整数,指向我的信号开始的地方; BUF 缓冲区的大小(~16000)。

没有意义的是如果我手动循环 cha_signal,使用

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

我可以很好地访问它的所有元素!出于某种原因,看似等效的 memcpy() 操作阻塞了。我怀疑,但我的知识不足以证实,这是由于 cha_signal 的制作方式造成的:

/* 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;

有什么想法吗?我注意到另一个人也有类似的问题,但他试图写入未分配的空间。我相信我在这里分配正确。

最佳答案

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

对于在 mmap 的另一侧实现任何 FPGA 外围设备的“硬件专家”来说,这可能是一个问题。

由于您似乎访问的是硬件寄存器,而不仅仅是普通的旧内存,因此您必须遵守不同的规则。某些硬件要求您按字节、字或其他涉及对齐的规则访问内存。

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

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

关于c - 尝试在由 mmap() 生成的指针上使用 memcpy() 时出现总线错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23553550/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com