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

Best practices for designing registers into a peripheral that will be accessed by C and C++?

本文关键字:访问 C++ 外设 最佳 寄存器      更新时间:2023-10-16

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

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

我之所以这么问,是因为读取会读回与刚写入的数据不同的数据,而且读取会产生副作用(它会从队列中提取下一个字节(。

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

相关问题:C/C++是否保证单个内存位置的读取总是一次读取,而不是以某种方式导致多次读取。长期的经验表明可以,但我想知道规格是怎么说的。

注意:我总是声明指向外围寄存器的指针是易失的,如下所示:易失性uint32_t*p_reg;

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

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

甚至在现实世界中,看起来像纯读取的操作实际上写入了内存。无论是C还是C++标准中都没有禁止这种情况。

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