多核异构的硬件基础:共享存储区和寄存器和中断的设计。
寄存器和中断用来实现各个核中进程间的事件的通信,共享存储区用来实现各个核之间的数据的传递与共享。
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