将寄存器设计成可由C和C++访问的外设的最佳实践
Best practices for designing registers into a peripheral that will be accessed by C and C++?
我正在FPGA中设计一个串行端口外设,该外设将具有处理器可见的内存映射寄存器。
C/C++(我两者都用(是否保证写入内存位置不会导致从同一位置读取?
我之所以这么问,是因为读取会读回与刚写入的数据不同的数据,而且读取会产生副作用(它会从队列中提取下一个字节(。
我正试图为TX和RX数据共享一个单独的内存位置,以最小化我的解码逻辑的大小。
相关问题:C/C++是否保证单个内存位置的读取总是一次读取,而不是以某种方式导致多次读取。长期的经验表明可以,但我想知道规格是怎么说的。
注意:我总是声明指向外围寄存器的指针是易失的,如下所示:易失性uint32_t*p_reg;
在C或C++中,实际上都没有写入内存位置这回事。只有代码和内存,编译器决定是读取还是写入内存,以使代码按照其认为必要的方式执行代码需要执行的操作。您的平台可能会让volatile
做您想做的事,也可能不会,但这是一个特定于平台的问题。
如果您编写了j=1;
,并且您有一个平台,其中除零以外的常数很昂贵,但增量很便宜,那么如果需要,实现可以自由地将其视为j=0; ++j;
。
甚至在现实世界中,看起来像纯读取的操作实际上写入了内存。无论是C还是C++标准中都没有禁止这种情况。
您可以查看volatile
周围的编译器文档,看看它是否满足您的需要。如果没有,请查看内联程序集代码。如果在您的平台上这样做是明智的,那么一个像样的编译器应该提供一个很好的方法
相关文章:
- 通过方法访问结构
- 使用不带参数的函数访问结构元素
- 如果我只是不访问queue_front节点的子节点,而是将它们推到队列中呢?还是BFS吗
- 用于访问容器<T>数据成员的正确 API
- 访问者访问变体并返回不同类型时出错
- 尝试通过多个向量访问变量时,向量下标超出范围
- 无法访问嵌套类.类的使用无效
- 写入位置0x0000000C时发生访问冲突
- 我们可以访问一个不存在的联盟的成员吗
- C++从另一个类访问公共静态向量的正确方法是什么
- 我的简单if-else语句是如何无法访问的代码
- 从C++dll访问C#中的一行主要参数
- 概念TS检查忽略私有访问修饰符
- 访问被拒绝后,c++中的故障保护代码
- 在c++中访问int到类对象的映射时出错
- 我想访问std::unique_ptr中的一个特定元素
- 为什么示例代码访问IUnknown中已删除的内存
- C++:无法访问声明的受保护成员
- 通过指向指针数组的指针访问子类的属性
- 如何使用单独文件中的派生类访问友元函数对象