深入理解DM8168中的线程通信

来源:互联网 发布:金山卫士 源码 编辑:程序博客网 时间:2024/06/13 22:10

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

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

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






0 0
原创粉丝点击