我正在开发一个使用LEON2(SparcV8)处理器的项目,我们有一个连接其他FPGA和处理器的PCI总线。
在此上运行我们有一个使用RTEMS的多任务应用程序,用C语言编写。
现在我对处理器和pci架构并不熟悉,这就是为什么我来找你们进行启发。
问题在于:考虑我们有一个RTEMS任务执行PCI总线上的内存读取。在我们的主板上,PCI访问大约是2us长。现在,我的一位同事提出了一个问题,如果在PCI读取期间,RTEMS的任务调度程序决定是时候启动另一个任务,并且该任务工作也是执行PCI读取。 他的观点是,任务切换之前执行的第一次PCI读取将被第二次PCI读取破坏,第二次PCI读取将在执行第一次任务之前执行。
这种情况会发生吗?
我的观点是这个问题不应该发生,因为对我来说,PCI读取就像任何其他内存读取一样,只是不是读取本地RAM,例如地址0x4000'0000,我们读取地址然后,处理器将0xA020'0000转换为PCI总线上的地址,并通过总线执行读取操作。 当然这个读取比本地内存读取更长,但这个过程不应该在中间中断。 我的理解可能完全没有,在这种情况下随时纠正我!
答案 0 :(得分:2)
注意:我指的是PCI Express(PCIe)。 PCI可能有点不同 - 我不熟悉它。
这取决于执行读取的PCIe核心(模块)。
基本上,要执行内存读取,PCIe内核会在标记的总线上发送MemRd数据包。数据本身到达具有相同标记的Completion数据包。因此,读取不会“损坏”。
现在,PCIe内核可能会阻塞CPU,直到收到完成数据包,或者它可以在发送MemRd数据包后立即释放CPU。在这种情况下,PCIe内核需要能够处理多个并发的挂起读取。