我正在处理涉及内存映射FPGA寄存器的输入输出嵌入式项目。这些内存区域的指针需要标记为
在某些情况下,我们希望将一系列FPGA寄存器复制到缓冲区以供进一步使用。由于这些寄存器映射到连续的地址,因此
是否可以安全地(并理智地)强制转换指针的
volatile
,以便编译器不会通过缓存CPU寄存器中的值来“优化”对FPGA的读写。在某些情况下,我们希望将一系列FPGA寄存器复制到缓冲区以供进一步使用。由于这些寄存器映射到连续的地址,因此
memcpy
似乎是合适的选择,但是把我们的volatile
指针作为源参数传递会发出关于丢弃volatile
限定符的警告。是否可以安全地(并理智地)强制转换指针的
volatile
属性以抑制此警告?除非编译器进行某些神奇的操作,否则我无法想象调用memcpy
失败执行实际复制的场景。另一种选择是只使用for
循环一个字节一个字节地复制,但是memcpy
实现可以根据复制的大小、对齐方式等来优化复制。
memcpy
进行MMIO操作。数据必须按特定顺序写入吗?会有副作用吗?你要写入的MMIO部分是否像内存一样工作? - tangrsmemcpy
写入MMIO寄存器组仍然让我感觉“不对劲”。据我所知,大多数需要移动大量数据的外设都采用DMA或通过重复读取寄存器来实现。我只会在MMIO上使用memcpy
的情况是如果内存地址范围确实由RAM支持(但在这种情况下,为什么您需要首先使用volatile
?编译器内存屏障就足够了)。 - tangrs