缓冲区中帧的所有权 - C 编程

Ownership of frame in buffer - C programming

我是硬件和软件之间的编程接口。我知道我应该得到什么结果,现在我正在考虑如何最有效地实现它。我有一种循环 FIFO 缓冲区,操作系统将在其中写入数据,而硬件将从中读取数据。所以基本上我有 readwrite 指针, read 在 DMAC 时移位(DMA 控制器正在读取数据从内存中)和 write 在我的程序写入内存时移位。这个循环 FIFO 缓冲区中的基本块称为帧(我这样称呼它们)。所以我总是在缓冲区中读取和写入帧。现在我想知道是否可以指出谁拥有框架(HW 或 SW)?我有想法在每一帧的开头放置一些标志,以指示是 HW 还是 SW 拥有的帧。但我不知道我应该那样做,还是有更好的方法用 C 来做???例如,一开始缓冲区中的所有帧都属于 OS (SW),然后当我的程序完成写入第一帧时,我将所有权传递给 HW(或我的 DMA 控制器)。同样,当 DMA 控制器完成从内存读取时,我将帧的所有权传递给 OS。所以我有一种方法可以在每一帧的开头使用标志来做到这一点,但我想知道是否有更好的方法来做到这一点?

提前感谢您的回答:)

我通常做的是队列指针或帧索引,而不是实际的 I/O 数据。帧数组的索引只需要一个字节,因此很容易 queued/manipulated。我在启动时将大部分索引放入用户状态池队列,其余放入 'rxPool' 队列,供 rx driver/s 从中提取新的 rx 数据。每个帧都有一个 2 位状态字段,指示其当前使用状态,(在用户池中,在 rxPool 中,持有 tx 数据,持有 rx 数据)。

我将索引放入 DMA/interrupt 驱动程序并启动它(如果还没有 运行)。 DMA/whatever 完成后,我将 tx/rx 索引排回 'scavenge' 队列并发出信号量信号。 I/O 驱动程序线程,(等待信号量),然后向 I/O 发起线程发出信号,(新的 rx 帧),将索引释放回 'pool' 队列,准备重新use, (used tx frame), or 'top-up the rxPool queue if not full.

我过去所做的是在完成时将指针传递给 DMA 驱动程序。驱动程序在下一个时钟周期切换到新指针。

DMA 驱动程序与 60Hz 的显示同步信号相关联,而应用程序仅以大约 10Hz 的频率更新指针,但在等待新图像时显示旧图像并没有什么坏处。

我不确定这是否符合您的问题。