c++ - 将寄存器设计成可由 C 和 C++ 访问的外围设备的最佳实践?

标签 c++ c fpga specifications

我正在 FPGA 中设计一个串行端口外围设备,它将具有对我的处理器可见的内存映射寄存器。

C/C++(我同时使用)是否保证写入内存位置不会导致从同一位置读取?

我问是因为读取会读回与刚刚写入的数据不同的数据,并且因为读取有副作用(它从队列中拉出下一个字节)。

我正在尝试为 TX 和 RX 数据共享一个内存位置,以最小化解码逻辑的大小。

相关问题:C/C++ 是否保证单个内存位置读取始终是单次读取,而不是以某种方式最终成为多次读取。长期的经验表明是的,但我想知道规范是怎么说的。

注意:我总是将指向外设寄存器的指针声明为易变的,如下所示: volatile uint32_t * p_reg;

最佳答案

在 C 或 C++ 中,确实没有写入内存位置这样的事情。只有代码和内存,编译器决定是读取还是写入内存以使代码按照它认为必要的方式执行代码需要执行的操作。您的平台可能volatile做您想做的事,也可能不做,但这是一个特定于平台的问题。

如果您编写 j=1; 并且您有一个平台,其中除零之外的常量很昂贵但增量很便宜,实现可以自由地将其视为 j=0;++j; 如果需要的话。

在现实世界中甚至有这样的案例,看起来像纯读取的操作实际上写入了内存。 C 和 C++ 标准中没有任何内容禁止这样做。

您可以查看有关volatile 的编译器文档,看看它是否满足您的需要。如果没有,请查看内联汇编代码。如果在您的平台上这样做是明智的,那么一个好的编译器应该提供一个很好的方法来做到这一点。

关于c++ - 将寄存器设计成可由 C 和 C++ 访问的外围设备的最佳实践?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53093362/

相关文章:

c++ - Visual Studio C++ 应用程序无法在 32 位计算机上运行

c - 使用 ASCII 字符和进行二进制搜索字符串?

c - C语言中的 friend 对算法递归解决方案

algorithm - 快速、小面积、低延迟的部分排序算法

vhdl - vivado block 设计器在修改 verilog 或 vhdl RTL 文件后不更新 block 设计中的 RTL 接口(interface)

c++ - 在一个线程中通过 tcp socket 发送和接收数据

php/c++ - PHP 和 C++ 客户端(REST、套接字等)之间通信的最佳方法

C 程序正在执行一个分支,即使它不应该

vhdl - 如何移动 std_logic_vector?

C++ 可变关键字如何影响容器的性能?