所以在原子性问题上,PCIe 3.0规范(我只有一个)被提到了几次。
首先你有第 6.5 节 锁定交易这可能不是您所需要的,但无论如何我想记录下来。基本上,这是您之前描述的最坏的情况。
需要锁定事务支持来防止使用遗留软件的系统中出现死锁
这会导致对 I/O 设备的访问
但无论如何,您都需要正确检查它的使用情况,正如它所指出的那样。
如果与锁定序列相关的任何读取未成功完成,请求者必须
假设锁的原子性不再得到保证,并且锁之间的路径
请求者和完成者不再被锁定
照这样说第 6.15 节 原子操作 (AtomicOps)更像是您感兴趣的内容。您可以使用 AtomicOps 指令执行 3 种类型的操作。
FetchAdd(获取和添加):请求包含单个操作数,即“添加”值
交换(无条件交换):请求包含单个操作数,即“交换”值
CAS(比较和交换):请求包含两个操作数,一个“比较”值和一个“交换”值
Reading 第6.15.1节我们看到提到这些指令主要是在单个总线上存在多个生产者/消费者的情况下实现的。
AtomicOps 支持高级同步机制,当存在以下情况时特别有用:
需要以非阻塞方式同步的多个生产者和/或多个消费者。例如,多个生产者可以安全地排队到一个公共队列,而无需任何显式锁定。
搜索规范的其余部分,我发现除了与这些 AtomicOps 相关的部分之外,几乎没有提到原子性。对我来说,这意味着规范仅在使用这些操作时确保此类行为,但是实现此操作的上下文表明,只有当存在多生产者/消费者环境(而您的环境显然不存在)时,他们才会出现此类问题。
The last place I would suggest looking to answer your question is Section 2.4 Transaction Ordering To note I am fairly sure the idea of transactions "passing" others only makes sense with switches in the middle as these switches can make such decisions, once your put bits on the bus in your case there is no going back. So this likely only applies if you place a switch in there.
您关心的是写入是否可以绕过读取。写的是发布的,读的是非发布的。
A3, A4 A Posted Request must be able to pass Non-Posted Requests to avoid deadlocks.
所以一般来说允许写绕过读以避免死锁。
考虑到这一点,我认为写入不可能绕过系统上的读取,因为总线上没有设备可以执行此事务重新排序。由于您有 RTOS,我非常怀疑它们正在查询 PCIe 事务并在发送之前对它们重新排序,尽管我个人还没有对此进行过研究。