找回密码
 注册
关于网站域名变更的通知
查看: 299|回复: 1
打印 上一主题 下一主题

创龙带您解密TI、Xilinx异构多核SoC处理器核间通讯

[复制链接]
  • TA的每日心情
    奋斗
    2020-3-25 15:17
  • 签到天数: 1 天

    [LV.1]初来乍到

    跳转到指定楼层
    1#
    发表于 2020-9-8 09:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

    EDA365欢迎您登录!

    您需要 登录 才可以下载或查看,没有帐号?注册

    x
    1.什么是异构多核SoC处理器顾名思义,单颗芯片内集成多个不同架构处理单元核心的SoC处理器,我们称之为异构多核SoC处理器,比如:  T$ o( E8 J3 ~- h
    • TI的OMAP-L138(DSP C674x + ARM9)、AM5708(DSP C66x + ARM Cortex-A15)SoC处理器等;
    • Xilinx的ZYNQ(ARM Cortex-A9 + Artix-7/Kintex-7可编程逻辑架构)SoC处理器等。" a, p6 K, v' U+ J9 J7 u- R9 @# G- F3 T

    # Z8 g; g" [9 D2.异构多核SoC处理器有什么优势相对于单核处理器,异构多核SoC处理器能带来性能、成本、功耗、尺寸等更多的组合优势,不同架构间各司其职,各自发挥原本架构独特的优势。比如:+ u6 J+ w/ d8 E7 y, B  S
    • ARM廉价、耗能低,擅长进行控制操作和多媒体显示;
    • DSP天生为数字信号处理而生,擅长进行专用算法运算;
    • FPGA擅长高速、多通道数据采集和信号传输。0 w* ~$ K" A% z; [  p' ?
    同时,异构多核SoC处理器核间通过各种通信方式,快速进行数据的传输和共享,可完美实现1+1>2的效果。
    6 r7 A# L( S7 O( x7 z/ t4 h: D7 I2 F+ W# \  ~. r1 [7 ^. p6 F
    3.常见核间通信方式要充分发挥异构多核SoC处理器的性能,除开半导体厂家对芯片的硬件封装外,关键点还在于核间通信的软硬件机制设计,下面介绍几种在TI、Xilinx异构多核SoC处理器上常见的核间通信方式。% H7 o  C8 F9 P) i
    • OpenCL! T: g3 Q. x8 A) N
    OpenCL(全称Open Computing Language,开放运算语言)是第一个面向异构系统通用目的并行编程的开放式、免费标准,也是一个统一的编程环境,便于软件开发人员编写高效轻便的代码,而且广泛适用于多核心处理器(CPU)、图形处理器(GPU)、Cell类型架构以及数字信号处理器(DSP)等其他并行处理器,在能源电力、轨道交通、工业自动化、医疗、通信、军工等应用领域都有广阔的发展前景。& N- W+ q" P# f  f0 Q3 t
    在异构多核SoC处理器上,OpenCL将其中一个可编程内核视为主机,将其他内核视为设备。在主机上运行的应用程序(即主机程序)管理设备上的代码(内核)的执行,并且还负责使数据可用于设备。设备由一个或多个计算单元组成。比如,在TI AM5728异构多核SoC处理器中,每个C66x DSP都是一个计算单元。
    5 I- o  g/ N2 ^8 C9 t( u/ s9 T

    / u4 Z6 e0 D, d( IOpenCL运行时,一般包含如下两个组件:
    7 ]! m: Q/ p3 V) \9 V
    • 主机程序创建和提交内核以供执行的API。
    • 用于表达内核的跨平台语言。
      " ~, Q) O9 @2 q; Q
    参考开发资料:
    ; `+ w( e2 f/ J, {; ?3 Z  F# r( Zhttp://downloads.ti.com/mctools/ESD/docs/opencl5 k) F% h: G- F* `! O
    https://training.ti.com/sites/default/files/docs/Introduction_to_OpenCL_slides.pdf6 Y* ?% B% r1 e. {6 l
    • DCE+ |! L. e& q) ^
    DCE(Distributed Codec Engine)分布式编解码器引擎,是TI基于AM57x异构多核SoC处理器的视频处理框架,提供的完整Gstreamer插件框架。% i' \: X/ o* D( @" x/ w
    DCE由三部分硬件模块组成,分别为MPU核心、IPU2核心以及IVA-HD硬件加速器,其主要功能如下:* _8 N& `9 a; f* y
    MPU:基于ARM用户空间Gstreamer应用,控制libdce模块。libdce模块在ARM RPMSG框架上实现与IPU2的IPC通信。
    & B1 r/ q% L" N+ c1 N* FIPU2:构建DCE server,基于RPMSG框架与ARM实现通信,使用编解码器引擎和帧组件控制IVA-HD加速器。* ~- W+ }+ P2 S0 n
    IVA-HD:实现视频/图像编解码的硬件加速器。! t: @" ?- w# \4 v7 g! K. G
    ( K( t# x- b2 ^0 j
    " ]/ N# N2 s+ L& s, F, F8 n8 o  {
    • IPC% z  Z# _0 G# R; ?
    IPC(Inter-Processor Communication)是一组旨在促进进程间通信的模块。通信包括消息传递、流和链接列表。这些模块提供的服务和功能可用于异构多核SoC处理器中ARM和DSP核心之间的通信。7 }! s2 Z8 M9 ?2 B& B% R, g2 a

      D* v, {2 T- n, Y& C1 V8 Y如下为TI异构多核SoC处理器常用的核间通信方式的优缺点比较:+ J* C* @- G( u" w4 Y0 O! X

    : A" j+ u# S% |. ]+ p0 S
    方式1 ^( n2 E# y8 _- A% K
    优点
    % {8 ]& S& z* G3 g! s: |
    缺点
    ! Q8 l( K# b* L9 x/ T* D
    OpenCL
    ; o6 w! ]6 F& J$ N- v7 X
    • 易于在设备之间移植
    • 无需了解内存架构
    • 无需担心MPAX和MMU
    • 无需担心一致性
    • 无需在ARM和DSP之间构建/配置/使用IPC
    • 无需成为DSP代码、架构或优化方面的专家; O4 Y: o) l5 u. X) U
    • 无法控制系统内存布局等以处理优化的DSP代码
      * \; d0 j$ R1 X) o0 O0 s# `
    DEC
    ( D" ~/ J. p, k3 n% _
    • 加速多媒体编解码处理
    • 在与Gstreamer和TI Gstreamer插件连接时简化多媒体应用程序的开发3 }' a: A. w5 H) }  ~
    • 不适合非编解码算法
    • 需要努力添加新的编解码算法
    • 需要DSP编程知识; T5 H7 l, e& [* X6 U2 Q6 A* _/ w1 |
    IPC
    0 T! \; f6 o/ t% k( S
    • 完全控制DSP配置
    • 能够进行DSP代码优化
    • 在多个TI平台上支持相同的API
      - d# M, L5 V  e$ W
    • 需要了解内存架构
    • 需要了解DSP配置和编程
    • 仅限于小型消息(小于512字节)
    • TI专有API* g' i2 \  F& _& [( P

    6 h4 g  i6 c3 J& s
    • AXI
      6 k  Q1 s( I$ l& u2 U
    AXI(Advanced eXtensible InteRFace)是由ARM公司提出的一种总线协议,Xilinx从6系列的FPGA开始对AXI总线提供支持,目前使用AXI4版本。
    : ?' ]2 Q8 ]4 b; k- D

    $ D" A' t3 h( V. d. @# K  K0 SZYNQ有三种AXI总线:" R7 g& f1 \/ x- g* v$ X. c+ \- @: N$ v
    (A)AXI4:(For high-performance memory-mapped requirements.)主要面向高性能地址映射通信的需求,是面向地址映射的接口,允许最大256轮的数据突发传输。; w& I/ A( {9 Q- |
    (B)AXI4-Lite:(For simple, low-throughput memory-mapped communication.)是一个轻量级的地址映射单次传输接口,占用很少的逻辑单元。
    7 o) Z' _' D$ {5 t(C)AXI4-Stream:(For high-speed streaming data.)面向高速流数据传输,去掉了地址项,允许无限制的数据突发传输规模。5 E/ y. w, ^$ P, ~+ Q! _2 B# L
    AXI协议的制定是要建立在总线构成之上的。因此,AXI4、AXI4-Lite、AXI4-Stream都是AXI4协议。AXI总线协议的两端可以分为分为主(master)、从(slave)两端,他们之间一般需要通过一个AXI Interconnect相连接,作用是提供将一个或多个AXI主设备连接到一个或多个AXI从设备的一种交换机制。
    9 k9 [+ ?! w- G/ s3 w" PAXI Interconnect的主要作用是:当存在多个主机以及从机器时,AXIInterconnect负责将它们联系并管理起来。由于AXI支持乱序发送,乱序发送需要主机的ID信号支撑,而不同的主机发送的ID可能相同,而AXI Interconnect解决了这一问题,他会对不同主机的ID信号进行处理让ID变得唯一。( q/ j8 z% l* n. J) Z! m$ U. e
    AXI协议将读地址通道、读数据通道、写地址通道、写数据通道、写响应通道分开,各自通道都有自己的握手协议。每个通道互不干扰却又彼此依赖。这是AXI高效的原因之一。& k: S9 h8 ?! ]# ]; s1 G
    ) }' T' N1 k. k8 o
    4.IPC核间通信开发下面以创龙AM57x(AM5728/AM5708)评估板源码为例,讲解IPC核间通信开发。. `/ p* R1 o1 Q6 j

    4 S: U/ ^! \9 }# b
    开发环境说明
    9 O5 p- c( W& |* d' ]5 m
    • RTOS Processor-SDK 04.03.00.05。
    • Linux-4.9.65/Linux-RT-4.9.65内核。
    • IPC开发包版本:3.47.01.00。5 Z2 L- |7 B  `9 t. g
    IPC(Inter-Processor Communication)提供了一个与处理器无关的API,可用于多处理核心环境中的核间通信、与同一处理核心上的其他线程的通信(进程间)和与外围设备(设备间)的通信。IPC定义了以下几种通信组件,如下表所示,这些通信组件的接口都有以下几个共同点:
    . O3 |; Q" m4 ~) g
    7 F" e# q0 I5 R9 p' C
    - {3 |6 U" q+ p1 a* B
    Notify3 X6 l- ]; o2 r6 Y
    MessageQ
    : l( @* O: T$ e: n
    ListMp; I+ k. @8 }8 X0 R
    GateMp
    ; {8 ^* S! O* Q* T: e1 a6 N* n
    HeapBufMp
    0 |+ ~# z- L+ `* z. j7 l
    FrameQ(通常用于raw视频数据), x/ B8 N" k/ ~. s
    HeapMemMp/ k. V' a9 w; C2 ?
    RingIO(通常用于音频数据). v% G8 l6 S! `+ I9 Y8 A# [8 L

    6 s6 w0 R) r! O
    • 所有IPC通信组件的接口都由系统规范化命名。
    • 在HLOS端,所有IPC接口需要使用_setup()来初始化,使用_destroy()来销毁相应的IPC Module;部分初始化还需要提供配置接口_config()。
    • 所有的实例化都需要使用_create()来创建,使用_delete()来删除。
    • 在更深层次使用IPC时需要用_open()来获取handle,在结束使用IPC时需要用_close()来回收handle。
    • IPC的配置多数都是在SYS/BIOS下完成配置的,对于支持XDC配置的则可以使用静态配置方法。
    • 每个IPC模块都支持trace信息用于调试,而且支持不同的trace等级。
    • 部分IPCs提供了专门的APIs来用于提取分析信息。8 \# n$ [$ H# @* p0 T# I: y

    9 }" ?) v) W! l" A$ m7 c- c1 ~本小节主要演示MessageQ通信组件的运用。$ c6 [2 _$ E3 e( v% S4 M. B
    2 z/ v6 W: T! S/ z% P+ W5 l
    MessageQ机制
    ! f$ ^; v0 k! t& u$ }% U* b) T
    • MessageQ模块特点
      5 S: g& M/ @( F0 r3 @8 U
    • 支持结构化发送和接收可变长度消息。
    • 一个MessageQ都将有一个读者,多个编写者。
    • 既可用于同构和异构多处理器消息传递,也可用于线程之间的单处理器消息传递。
    • 功能强大,简单易用。7 Y4 _9 U- o' Y" p& s: ^" N
    3 a; y, z3 Q! c  O2 I, R4 X5 n
    • MessageQ机制代码解释
      & k/ J5 D& f5 ?8 V+ F
    MessageQ的传输,主要区分为发送者,跟接收者,下述为常用API的功能描述:$ ^$ ^+ D1 @5 B' q
    • MessageQ_Handle MessageQ_create (String name, MessageQ_Params *params):创建消息队列,创建队列名称将成为后面MessageQ_open的依据。
    • Int MessageQ_open(String name , MessageQ_QueueId * queueId):打开创建的消息队列,获取队列ID值(ID值应为唯一值,所以创建消息队列时名称要唯一)。
    • MessageQ_Msg MessageQ_alloc(UInt16 heapId, UInt32 size):申请消息空间,从heap中申请,所以需要先打开heap获取heapID,消息由MessageQ_Msg结构体长度规定。
    • MessageQ_registerHeap(HeapBufMP_Handle_upCast(heapHandle),HEAPID):注册堆,分配heapID给这个堆,作为一个唯一标识符。
    • Int MessageQ_put(MessageQ_QueueId queueId, MessageQ_Msg msg):发送消息到queueId对应的消息队列。
    • Int MessageQ_get(MessageQ_Handle handle,MessageQ_Msg *msg,UInt timeout):从消息队列中接收消息。
    • MessageQ_free(MessageQ_Msg *msg):释放msg空间,注意不用的消息空间需要释放,不然会导致内存问题。
      8 h% e' y8 p' v5 ~7 v- F; P2 E

    ; a' N2 }/ f( M8 Z9 ]以ex02_messageq例程为例,说明MessageQ机制的使用过程:1 B+ I! ]# g" Z: U: A, N5 l, P
    5 W, M- _3 Q+ O* }+ c
    例程运行流程图如下:& T$ t% ?) M, o( I" ~" ~

    & W4 ^+ V  G5 O" q, x结合实际代码分析上述流程:3 i  g9 l; F9 J& S# l3 l, k
    ARM:
    ; S" P: K9 x4 {$ U8 z! Wa)创建host消息队列,打开slave消息队列。9 z$ _" D% i6 i4 Q( B
    6 S0 x# `+ [$ }* S4 m# F; e
    b)发送消息至slave消息队列,监听host消息队列,等待返回信息 。2 C& }" ], @1 b$ T! r0 Q

    & w& v- K4 q+ f' Pc)发送shutdown消息至slave队列。7 j8 J: V# \- j# Z+ _- D$ m

    7 b$ a0 v+ n! r  w8 y& ]8 s% i. c0 _, pDSP:0 w3 Y" d& w% @+ o. t
    a)创建slave消息队列。
    + D4 K3 L1 H, Q

    7 a7 a1 `6 y( k0 p8 n0 cb)监听slave消息队列,并返回消息至host端。) m# ]' g$ G7 J9 N- |7 n

    4 I* \  x: r" i0 hc)接收shutdown消息,停止任务。  v7 M- n( R0 r) x. Z

    . W5 d, w* \7 ^# a% ~$ G8 r内存访问与地址映射问题; ]# o' ]; W* ], l6 o% L* C
    • 地址映射
      ; e- R! @0 m- s8 r, i
    首先,对于DSP/IPU子系统和L3互连之间的存储器管理单元(MMU),都用于将虚拟地址(即DSP/IPU子系统所查看的地址)转换为物理地址(即从L3互连中看到的地址)。# u0 g' b$ o& G$ ]
    DSP:MMU0用于DSP内核,MMU1用于本地EDMA。
      k! h& y: E. |% j- T/ O, A8 f+ d9 AIPU:IPUx_UNICACHE_MMU用于一级映射,IPUx_MMU用于二级映射。
    / b) I) V- I, d6 u/ T# ]rsc_table_dspx.h,rsc_table_ipux.h资源表中,配置了DSP/IPU子系统的映射关系,在固件启动前,该映射关系将会写入寄存器,完成映射过程。
    - D( n, m1 M, ~. K3 b0 }/ [

      _, J4 `7 D  `" P! n, M

    6 G! V5 ]+ A) X5 H
    ( _; g+ W9 F0 S6 r' W# u
    物理地址跟虚拟地址之间的映射关系查看:2 v9 V- C$ q0 S. b2 y
    DSP1:(默认配置mmu1的配置与mmu2的配置是一样的)
    3 x. F0 g! p; M9 j& Bcat /sys/kernel/debug/omap_iommu/40d01000.mmu/pagetable- X1 D5 u& E4 \/ `/ |6 A, {
    cat /sys/kernel/debug/omap_iommu/40d02000.mmu/pagetable- D1 b/ ]) i6 B, y, [7 f& z" o
    6 i, S! W: i: q% i8 x. U$ C: N
    DSP2:(默认配置mmu1的配置与mmu2的配置是一样的); a& ?" k' r) M* C' w" M
    cat /sys/kernel/debug/omap_iommu/41501000.mmu/pagetable
    5 B/ O4 i( }8 W: Y& E. b/ ycat /sys/kernel/debug/omap_iommu/41502000.mmu/pagetable
    1 l) s6 Z, q: o6 Z* ?) H  R  N9 i! O. Q. Z) x$ h
    IPU1:6 O4 ?- O+ V3 @5 M& I; @( e
    cat /sys/kernel/debug/omap_iommu/58882000.mmu/pagetable
    / L6 A8 m' ^: V; f6 p- N' F# R7 a- T) E" b2 @1 ]' |- T
    IPU2:3 ]* ~* S( Q. `' A( r1 }! [/ e) X/ s
    cat /sys/kernel/debug/omap_iommu/55082000.mmu/pagetable
    ! k4 @0 i! R9 ]& x8 w/ b

    ( M( G/ P  R# @+ Y2 |& hResource_physToVirt(UInt32pa,UInt32*da);: A/ w7 S" K. F7 T
    Resource_virtToPhys(UInt32da,UInt32*pa);  Y- {- ]% B, @# }$ Z7 u
    • 内存访问
      * l7 L) D- s/ ?& y9 i5 P7 l
    CMA内存
    3 J# n2 B6 d& ?# Y3 `CMA内存,用于存放IPC程序的堆栈,代码以及数据段。
    $ B# T3 [% [- y9 G$ |- I0 Fdts文件中,预留了几段空间作为从核的段空间(DDR空间):
    ! T4 Y' N. o, @0 q& y2 _( I6 Y

    % h/ u0 N6 J' O! Z, o& AIPC-demo/shared/config.bld:用于配置段空间的起始地址,以及段大小。5 n7 ?2 ]% D+ Y1 D
    0 d  G, {+ s: J- U
    以DSP1为例,说明DMA中的内存映射关系:
    / G8 X# `  D3 m, W- T/ ^" t: X& q4 J
    $ O6 f9 n9 z0 D# B) a
    通过系统中查看虚拟地址表,左边da(device address)对应的为虚拟地址,右边对应的为物理地址,那么虚拟地址的0x95000000的地址映射到的应该是0x99100002的物理地址。
    6 {; f) d. i2 m7 j. a- V  icat /sys/kernel/debug/omap_iommu/40d01000.mmu/pagetable
    8 H& ~  J( E6 z- `" x+ S' W9 p

    4 @# v& U) m1 X$ A0 i共享内存7 ^5 d4 z; n" A4 l0 o' A
    共享内存:其实是一块“大家”都可以访问的内存。6 |9 ~+ g2 Q2 X: ?) v6 x
    CMEM是一个内核驱动(ARM),是为了分配一个或多个block(连续的内存分配),更好地去管理内存的申请(一个或多个连续的内存分配block),释放以及内存碎片的回收。+ A5 F( V; C$ w% q8 Y2 u
    CMEM内存:由linux预留,CMEM驱动管理的一段空间。
    0 D6 Q6 u4 k& @( w3 i3 X! @" darch/arm/boot/dts/am57xx-evm-cmem.dtsi中定义了CMEM,并预留了空间出来作为共享内存(DDR & OCMC空间)。5 m/ r* R$ h; v1 R

    - ?* T6 e% x! L+ bcmem{}中最大分配的block数量为4个,cmem-buf-pools的数量没有限制。3 b9 Y" Q; C, J1 J" ?0 s5 O2 ^
    实际使用上,DSP与IPU访问的都是虚拟地址,所以还要完成虚拟地址到物理地址的映射关系。
    * c+ I& h+ W9 y# t. U4 ?7 k! jdsp1/rsc_table_dsp1.h定义了虚拟地址到物理地址的映射表,虚拟地址(0x85000000)到物理地址0xA0000000的映射,那么在DSP端访问0x85000000的地址时,实际上通过映射访问的物理地址应是0xA0000000。
    ! C1 [2 \( e+ r

    ) ^1 s. o" V( A( R6 N# X9 `# X* Y% r$ _9 Q$ j1 \2 Z6 }) z1 e5 ]
    cat /sys/kernel/debug/omap_iommu/40d01000.mmu/pagetable
    ' S" L) l% B* @1 |5 `

      s+ _# m( ?, W+ d, |! a实际应用:
    # q8 E! ?' l' z" u# _: G# x2 P, w! u8 Ca)初始化cmem。
    0 g; \' J8 E& o0 @' U1 g

    9 ]4 S3 y8 x* ?- cb)申请内存空间,并转换为物理地址(msg传输的时候传输的是物理地址,否则传输虚拟地址有不确定性)。" F' _" |: A* u4 c% o

    6 Z, g: ^) L- H, J$ MDSP端的处理:接收物理地址,转换为虚拟地址进行操作,发送操作完成的结果。这里DSP需要将地址返回给ARM的话,那应该将虚拟地址转换为物理地址,再传给ARM端。+ X$ E0 k# j# C/ B7 q  Z1 l

    ) I9 }) `: L! Z/ i' F' @0 ~, g& _
    0 W; H% w( {" @, z" l. w' W
  • TA的每日心情
    奋斗
    2020-9-8 15:12
  • 签到天数: 2 天

    [LV.1]初来乍到

    2#
    发表于 2020-9-8 10:49 | 只看该作者
    高性能、低成本、低功耗、
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-6-28 13:46 , Processed in 0.093750 second(s), 23 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

    快速回复 返回顶部 返回列表