2

我正在开发一个使用 LEON2 (SparcV8) 处理器的项目,并且我们有一个连接其他 FPGA 和处理器的 PCI 总线。

在此运行我们有一个使用 RTEMS 并用 C 编写的多任务应用程序。

现在我对处理器和 pci 架构一点也不熟悉,这就是我来找你们寻求启发的原因。

问题是这样的:考虑我们有一个 RTEMS 任务,它在 PCI 总线上执行内存读取。在我们的板上,PCI 访问大约有 2us 长。现在我的一位同事提出了一个问题,如果在 PCI 读取期间 RTEMS 的任务调度程序决定是时候触发另一个任务,并且该任务作业也执行 PCI 读取。他的观点是,在任务切换之前执行的第一次 PCI 读取将被第二次 PCI 读取破坏,第二次 PCI 读取将在执行第一个任务之前由第二个任务执行。

这种情况会发生吗?

我的观点是这个问题不应该发生,因为对我来说,PCI读取就像任何其他内存读取一样,只是我们读取地址0xA020'0000而不是读取例如地址0x4000'0000的本地RAM然后处理器将其转换为 PCI 总线上的地址,并通过总线执行此读取。当然这个读取比本地内存读取要长,但是这个过程在中间不应该是可中断的。我的理解很可能完全错误,在这种情况下,请随时纠正我!

4

1 回答 1

2

注意:我指的是 PCI Express (PCIe)。PCI 可能有点不同——我不熟悉它。

这取决于执行读取的 PCIe 内核(模块)。

基本上,为了执行内存读取,PCIe 内核在被标记的总线上发送一个 MemRd 数据包。数据本身以具有相同标签的完成数据包到达。所以读取没有“损坏”。

现在,PCIe 内核可能会阻塞 CPU,直到收到 Completion 数据包,或者它可以在发送 MemRd 数据包后立即释放 CPU。在这种情况下,PCIe 内核将需要能够处理多个并发未决读取。

于 2012-06-08T11:39:39.703 回答