【发布时间】:2015-09-11 09:51:07
【问题描述】:
我正在从事一个嵌入式项目,该项目涉及内存映射 FPGA 寄存器上的 I/O。指向这些内存区域的指针需要标记为volatile,这样编译器就不会通过在 CPU 寄存器中缓存值来“优化”对 FPGA 的读写操作。
在少数情况下,我们希望将一系列 FPGA 寄存器复制到缓冲区中以供进一步使用。由于寄存器被映射到连续地址,memcpy 似乎是合适的,但是将我们的 volatile 指针作为源参数传递会发出关于丢弃 volatile 限定符的警告。
丢弃指针的volatile-ness 以抑制此警告是否安全(并且理智)?除非编译器做了一些神奇的事情,否则我无法想象调用memcpy 将无法执行实际复制的场景。另一种方法是仅使用for 循环并逐字节复制,但memcpy 实现可以(并且确实)根据副本的大小、对齐方式等优化副本。
【问题讨论】:
-
我首先会担心将
memcpy用于MMIO。数据是否必须以任何特定顺序写入?会不会有副作用?你写的 MMIO 部分是否像记忆一样? -
你提出了非常有效的观点,我必须与 FPGA 人员再次核对,但是 AFAIK,不,不,是的。
-
使用
memcpy写入一组 MMIO 寄存器对我来说仍然感觉“错误”。 AFAIK,大多数需要移动大量数据的外设都使用 DMA 或重复读取寄存器。我在外设上使用memcpy的唯一情况是,MMIO 上的内存地址范围是否真的由 RAM 支持(但在这种情况下,为什么首先需要使用volatile?编译器内存屏障就足够了)。
标签: c memory volatile memcpy memory-mapping