【发布时间】:2018-10-31 23:40:10
【问题描述】:
我正在 FPGA 中设计一个串行端口外设,它的内存映射寄存器对我的处理器可见。
C/C++(我同时使用)是否保证写入内存位置不会同时导致从同一位置读取?
我问是因为读取会读回与刚刚写入不同的数据,并且因为读取有副作用(它从队列中拉下一个字节)。
我正在尝试为 TX 和 RX 数据共享一个内存位置,以最小化我的解码逻辑的大小。
相关问题:C/C++ 是否保证单个内存位置读取始终是单次读取,而不是以某种方式最终成为多次读取。长期的经验说是的,但我想知道规范是怎么说的。
注意:我总是将指向外围寄存器的指针声明为易失的,如下所示: 易失性 uint32_t * p_reg;
【问题讨论】:
-
不,我不相信 C++ 标准可以保证任何这样的事情。您可能想阅读
volatile限定符,但我并不认为这是相关的。 -
我认为
volatile可能保证这一点。但除此之外,我很确定它不会,因为它对抽象机器没有影响。 -
天哪,这被否决了。这是一个很好的问题。也许这个问题可以更好地表述为“读取和写入映射到物理外围设备的位置的最佳实践”
-
@pm100,更改标题会很好,但我对将寄存器设计成外设的最佳实践更感兴趣。感谢您的建议
-
有标准扩展iohw.h,但是我还没有看到实现它的实现......因为它是一个标准,如果你正在设计自己的接口,最好遵循任何一种的规范。在我使用 stm32 的实践中,我使用 keil's cmsis,他们使用宏并通过位操作访问位
&|`,例如 here。
标签: c++ c fpga specifications