C++ 将寄存器设计为可由C和C+访问的外围设备的最佳实践+;?
我正在FPGA中设计一个串行端口外设,它将具有对我的处理器可见的内存映射寄存器 C/C++(我同时使用这两种语言)是否能保证写入内存位置不会导致从同一位置读取 我之所以这样做,是因为读操作会读回与刚写操作不同的数据,而且读操作有副作用(它会从队列中提取下一个字节) 我试图为TX和RX数据共享一个内存位置,以最小化解码逻辑的大小 相关问题:C/C++是否保证单个内存位置的读取总是一次读取,而不是以某种方式结束多次读取。长期的经验表明是的,但我想知道规范是怎么说的 注意:我总是声明指向外围寄存器的指针是易失性的,如下所示:C++ 将寄存器设计为可由C和C+访问的外围设备的最佳实践+;?,c++,c,fpga,specifications,C++,C,Fpga,Specifications,我正在FPGA中设计一个串行端口外设,它将具有对我的处理器可见的内存映射寄存器 C/C++(我同时使用这两种语言)是否能保证写入内存位置不会导致从同一位置读取 我之所以这样做,是因为读操作会读回与刚写操作不同的数据,而且读操作有副作用(它会从队列中提取下一个字节) 我试图为TX和RX数据共享一个内存位置,以最小化解码逻辑的大小 相关问题:C/C++是否保证单个内存位置的读取总是一次读取,而不是以某种方式结束多次读取。长期的经验表明是的,但我想知道规范是怎么说的 注意:我总是声明指向外围寄存器的指
挥发性uint32_t*preg在C或C++中,没有一个写内存位置的东西。只有代码和内存,编译器决定是读取还是写入内存,以使代码按照它认为必要的方式执行所需的操作。您的平台可能会让
变得易变
做您想做的事情,也可能不会,但这是一个特定于平台的问题
如果你写j=1代码>并且您有一个平台,其中除零以外的常数很昂贵,但增量很便宜,实现可以自由地将其视为j=0++j代码>如果需要的话
甚至在现实世界中,看起来像纯读操作的操作实际上写入了内存。C和C++标准中没有任何东西禁止这个。
您可以查看volatile
周围的编译器文档,看看它是否满足您的需要。如果不是,请查看内联汇编代码。如果这是在你的平台上做的事情,一个好的编译器应该提供一个很好的方法来做它。< / P>不,我不相信C++标准保证任何这样的事情。您可能想仔细阅读volatile
限定符,但我认为这并不相关。我认为volatile
可以保证这一点。但除此之外,我很确定它不会,因为它对抽象机器没有影响。天啊,这被否决了。这是一个很好的问题。也许这个问题最好表述为“读取和写入映射到物理外围设备的位置的最佳实践”@pm100,更改标题会很好,但我更感兴趣的是将寄存器设计成外围设备的最佳实践。谢谢你的建议有标准扩展,但我还没有看到实现它的实现。。。由于它是一种标准,如果您正在设计自己的接口,最好遵循任何类型的规范。例如,在我使用stm32的实践中,他们使用宏并通过位操作访问位。&
|`。没有任何保证,我想知道嵌入式系统最终是如何工作的。@NXT有几种方法。最常见的是使用平台提供的函数或宏,通常是通过内联汇编代码,保证提供您想要的行为。一些平台具有特定于平台的关于volatile
的保证,或者具有“超级volatile”的特殊类型,并保证您需要的特定内容。显然,人们希望创建可用的平台,因此他们试图为您提供简单的方法来获得您可能需要的有保证的语义。(如果这在您的平台上是合理的,那么您的编译器应该为您提供获取它的简单方法。)有意义的是,我应该编写一个宏来处理给定随机指针时的读写情况。实际上,我开始认为我应该放弃将读/写语义组合到单个寄存器位置的想法。