天天看点

深入理解DM8168中的线程通信

多核异构的硬件基础:共享存储区和寄存器和中断的设计。

寄存器和中断用来实现各个核中进程间的事件的通信,共享存储区用来实现各个核之间的数据的传递与共享。

1+《基于T264的编码器在多核异构处理器上的设计与实现_王娇》这篇文章讲的非常详细

包括本地通信流程,异地通信流程。

在存储器 DDR3 中开辟多核之间可以共享的缓冲区,每个通道所映射缓冲区地址独立, 以供多核之间进行数据传递

link 在视频数据流中是最基本的单元模块 , 每个

link 中包含了一个基于 BIOS6/Linux 的任务 、 线程、

消息盒( 使用操作系统的信号量实现 ) 。 由于每个 link

运行一个独立的线程 , 因此各个 link 之间可以并行

运行 。 消息盒是关联用户指定的 link , 让 link 之间有

个互相对话的机制 , 用来传递信令 。 而对于视频流数

据 、 原始图像数据的传递 link 实现了专门的接口来

实现 ,只传递指针,而不是数据 。 基于 link 结构 , 视频

处理的流程中 , 所有工作量就可以均衡到每个处理

器内核上去执行

Mailbox 为处理器提供了通过写寄存器向其他处理器发送中断的机制 

DM8168 通过自旋锁( Spinlock )实现了系统共享资源的互斥

根据这 linkId 判断这个消息是发给本地的 link 还是远端处理器的 link ;

如果是本地的直接调用 BIOS/LINUX API 函数,否则就通过 Syslink 模块的 MessageQ 发送这

个消息到指定的处理器,让其调用对应的函数处理

link 之间使用缓冲队列进行帧交换 ,没有理解FULL队列和EMPTY队列

getFullFrames :该 link 从设备驱动获取视频数据;

putEmptyFrames :归还该 link 的帧 buffer 

当一个 link 采集完或处理完一帧数据后会发送一

个消息“ SYSTEM_CMD_NEW_DATA” 给后向的 link ,通知它有数据可取; 后向 link 收到该

消 息 后 可 调 用 System_getLinksFullFrames() 函 数 来 获 取 帧 数 据 , 处 理 完 后 再 调 用

System_putLinksEmptyFrames() 函数来归还给前向 link 继续使用   为什么要归还

读取上一个Link的数据信息 如果需要处理帧,则分配空buffer 将处理之后的buffer指针传递给输出队列,并且通知下一个Link

继续阅读