我们使用 PRU 上的汇编器代码来实现快速 IO 采样和时间戳。 通过 PRU 共享12KB RAM 中的寄存器接口从 Linux 控制 PRU。 其中一个寄存器是 DRAM 中一个大环形缓冲区的地址、该缓冲区使用 Linux cmem 驱动程序进行分配。 PRU µs 与外设 GPIO 器件的 SPI 连接、并每4 μ s 检查一次 IO 状态。 发生更改时、包含新状态和更改时间的事件结构将使用 sbbo 指令写入 DRAM 环缓冲区。 执行该指令后、PRU 本地 RAM 中的寄存器将更新为指向环形缓冲区中新事件的指针、再次使用 sbbo 指令。
从 Linux 读取 PRU 本地 RAM 中的事件指针寄存器时、有时会更新 PRU RAM 寄存器、但 DRAM 环缓冲区不包含新的事件结构。 短时间(几毫秒)后、将出现新事件。
我假设 PRU RAM 写入/读取周期比 DRAM 写入/读取周期快、即使 PRU 首先写入 DRAM、而 Linux 首先从 PRU RAM 读取也是如此。 如果是、是否可以对存储器访问进行序列化?
另一个可能的原因可能是 DRAM 被缓存、并且未注意到物理内存的变化。 DRAM 环形缓冲器在 Linux 用户空间应用程序中使用标志 PROT_READ | PROT_WRITE 和 MAP_SHARED 进行 mmwed。 在访问存储器之前、是否有办法使数据高速缓存行无效?