ipc通信详解教程_第1页
ipc通信详解教程_第2页
ipc通信详解教程_第3页
ipc通信详解教程_第4页
ipc通信详解教程_第5页
已阅读5页,还剩91页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

IPC通信

IPCisagenerictermofInter-ProcessorCommunicationreferredwidelyintheindustry,but

alsoapackageinTlProcessorSDKformulti-corecommunication.Ingenericusage,there

aredifferentwaysformulti-corecommunicationsuchasOpenCL,DCE,TI-IPC,andetc.

InTPsIPCpackage,itusesasetofmodulestofacilitatetheinter-processorcommunication.

Thedocumentsbelowprovideoverviewtodifferentwaysofinter-processorcommunication

andmoredetailsbyfollowinglinksineachofthesubject.TheTlIPCUser'sGuideisalso

providedforreference.

IPC是业界广泛引用的处理器间通信的通用术语,也是TI处理器SDK中用于多核通信的一

个软件包。在一般情况下,多核通信的方式有OpenCL、DCE、TI-IPC等。在TI的IPC包

中,它使用了一组模块来方便处理器间的通信。下面的文档提供了对处理器间通信的不同方

式的概述,并通过在每个主题中的链接来提供更多的细节。还提供了TlIPC用户指南,以

供参考。

4.4.IPC

Inter-ProcessorCommunication(IPC)providesaprocessor-agnosticAPI

whichcanbeusedforcommunicationbetweenprocessorsinamulti­

processorenvironment(inter-core),communicationtootherthreadsonsame

processor(inter-process),andcommunicationtoperipherals(inter-device).

TheAPIsupportsmessagepassing,streams,andlinkedlists.IPCcanbe

usedtocommunicatewiththefollowing:

・Otherthreadsonthesameprocessor

•ThreadsonotherprocessorsrunningSYS/BIOS

•ThreadsonotherprocessorsrunninganHLOS(e.g.,Linux,QNX,Android

处理器间通信(IPC)提供了一个与处理器无关的API,可用于多处理器环境中处

理器之间的通信(内核间)、与同一处理器上的其他线程的通信(进程间)和与外围

设备(设备间)的通信。API支持消息传递、流和链接列表。IPC可用于与以下方

面进行通信:

同一处理器上的其他线程

运行SYS/BIOS的其他处理器上的线程

运行HLOS的其他处理器上的线程(例如Linux、QNX、Android)

Device1Device2

处理器间/处理器内部通信(IPC)是一种产品,用于在多处理器环境中实现处理器之间的通

信。IPC的特点包括消息传递、多处理器门、共享内存原语等.

IPC被设计用于与运行SYS/BIOS应用程序的处理器一起使用。这通常是ARM

或DSP。IPC包括支持高级操作系统(HLOS),如Unux,以及

SYS/BIOSRTOSo在HLOS环境中支持的IPC特征的宽度被减少,以便简化

产品。

IPC通常分布并安装在更大的SDK中。在这些情况下,不需要安装。

在SDK之外,IPC可以在这里下载,并作为zip文件发布。要安装,只需提取

文件即可..

这将在目录中提取IPC产品及其产品名称和版本信息(例如。c:/ti/ipc_)O

IPC产品提供多个处理器之间的软件连接。每个处理器可以运行HLOS(例如Linux、QNX)

或RTOS(例如,SYS/BIOS)oIPCisanopensourceproject,currentlymanagedwithgit,

andmaintainedathttp:〃/ipc/ipcdev.Fullsourcebrowsing,includingall

chanaes,areavailablehere.

处理器SDKInstaller(ti-processor-sdk-linux-[platformName]-evm-xx.xx-

Linux-x86-Install.bin)将安装必要的组件,以便在TI微处理器上启动您的开

发。SDK由MatrixAppLauncher起始点应用程序的源代码、一个开发文件系

统、一个目标文件系统、示例应用程序、工具链和板支持包、易用性脚本和文

档组成。处理器SDK现在包括ARMGCC工具链。处理器SDK是根据特定的

Linux发行版名称和版本Ubuntul6.04和18.04构建和测试的。注意,这并不

妨碍用户在其他Linux发行版上安装SDKo

最后一步是下载并安装处理器-SDKRTOS。要获取本软件的最新版本,请参见

设备的“软件产品"页:

示例的二进制图像位于主机和各个内核的相应目录中。可以通过使用通过

JTAG的CCS加载和运行二进制文件来运行示例。

3.7.3.IPCforAM57xx

Introduction

ThisarticleisgearedtowardAM57xxusersthatarerunningLinuxonthe

CortexA15.Thegoalistohelpusersunderstandhowtogainentitlementto

theDSP(c66x)andIPU(CortexM4)subsystemsoftheAM57xx.

AM572xdevicehastwoIPUsubsystems(IPUSS),eachofwhichhas2cores.

IPU2isusedasacontrollerinmulti-mediaapplications,soifyouhave

ProcessorSDKLinuxrunning,chancesarethatIPLI2alreadyhasfirmware

loaded.However,IPU1isopenforgeneralpurposeprogrammingtooffload

theARMtasks.

Therearemanyfacetstothistask:building,loading,debugging,MMUs,

memorysharing,etc.Thisarticleintendstotakeincrementalstepstoward

understandingallofthosepieces.

本文面向在CortexA15上运行Linux的AM57xx用户。其目标是帮助用户了

解如何获得AM57xx的DSP(C66x)和IPU(CortexM9子系统的权限。

AM572X设备有两个IPU(IPUSS),每个子系统有两个核心。IPU2被用作多媒体应用程序

中的控制器,所以如果您在运行处理器SDKLinux,那么IPU2很可能已经加载了固件。但

是,IPU1是开放的,用于通用编程来卸载ARM任务。

这个任务有很多方面:构建、加载、调试、MMU、内存共享等等。本文打算

采取渐进的步骤来理解所有这些部分。

AM57xxSOC"S"有多个处理器内核-CortexA15、C66xDSP和ARMM4内核。A15通常

运行诸如Linux/QNX/Android之类的HLOS,而RemoteCore(DSP)S和M4)运行RTOS。

在正常操作中,引导加载器(U-boot/SPL)引导并加载带有HLOS的A15。A15启动DSP

和M4内核。

NormalBoot

Timetoremotecore

execution

POPUserspaceinit

在这个序列中,电源复位与远程设备(即DSP和M4)之间的间隔取决于HLOS

初始化时间。

下图说明ARMLinux内核的远程proc/rpMsg驱动程序如何与运行RTOS的

从处理器(如DSP、IPU等)上的IPC驱动程序通信。

remoteproc

z

LinuxRTOS

rpmsg

Remoteproc/

rpmsg

MasterRemote

CoreCore

为了在从内核上设置IPC,我们在IPC包中提供了一些可从ARMLinux运行的

预先构建的示例。接下来的章节描述了如何构建和运行此示例,并将其用作此

工作的起点。

您需要将主机PC的ex02_messageq目录复制到目标上的目录(通过SD卡、

NFS导出、scp等)。您可以复制整个目录,尽管我们主要对以下文件感兴趣:

•dsp1/bin/debug/server_dsp1.xe66

・dsp2/bin/debug/server_dsp2.xe66

•host/bin/debug/app_host

・ipu1/bin/debug/server_ipu1.xem4

・ipu2/bin/debug/server_ipu2.xem4

Remoteproc驱动程序是硬编码的,以便在加载DSP/M4时查找特定的文件。

下面是它查找的文件:

•/Iib/firmware/dra7-dsp1-fw.xe66

•/Iib/firmware/dra7-dsp2-fw.xe66

•/Iib/firmware/dra7-ipu1-fw.xem4

•/Iib/firmware/dra7-ipu2-fw.xem4

*

•这些通常是与预期可执行的可执行的软链接。例如,让我们更新目标上

可执行的DSP1:

类似的程序可用于DSP2/IPPU1/IPU2,也可以更新固件的软链接,在运行时重新加载固件,

并从A15运行主机二进制文件。

OverallLinuxMemoryMap

root@am57xx-evm:cat/proc/iomem

CMACarveouts

root@am57xx-evm:dmesg|grep-icma

有关如何调整DSP/IPUCMA卡的尺寸和位置的详细信息,请参阅相应的章

节,更改DSP或IPU内存映射。要调整"默认CMA"部分的大小,这将作为

Linux配置的一部分完成:

Iinux/arch/arm/configs/tisdk_am57xx-evm_defconfig

CMEM

Toviewtheallocationatrun-time:

root@am57xx-evm:cat/proc/cmem

这表明我们在OxAOOOOOOO的物理基地址上定义了一个CMEM块,其总大小

为Oxc000000(192MB)。此块包含由1个缓冲区组成的缓冲池。池中的每个

缓冲区(本例中只有一个)被定义为大小为0xc000000(192MB)o

更改DSP内存映射

首先,重要的是要理解,存在一对位于DSP子系统和L3互连之间的存储器管

理单元(MMUS)。其中一个MMUUS用于DSP核心,另一个是针对其本地

EDMAo它们都用于将虚拟地址(即,由DSP子系统观看的地址)转换为物理地

址(即,从L3互连观看的地址)的相同目的。

DSP物理地址DSP代码/数据实际驻留的物理位置由CMAcarveouts进行定义。要更改此

位置,您必须更改香芹的定义。在LinuxDTS文件中定义了DSPcarveouts<,例如对于

AM57xxEVM:

您可以同时更改大小和位置。小心不要重叠任何其他carveouts!

此外,当您更改分出位置时,必须对资源表进行相应的更改。首先,如果您正

在进行内存更改,则需要一个自定义资源表。资源表是一个大型结构,是物理

内存和虚拟内存之间的“桥梁"。此结构用于配置位于DSP子系统前面的

MMU。IPCResourceCustomTable一文中提供了详细的信息。

创建自定义资源表后,必须将phys_mem_IPC_VRING的地址更新为与相应的CMA相同

的基址。

DSP虚拟地址

这些地址是DSP子系统看到的地址,也就是链接器命令文件中的地址,等等。

您必须确保节的大小与资源表中的相应定义一致。您应该创建自己的资源表,

以修改内存映射。这是在页IPC资源自定义表中描述的。您可以查看IPC中的

现有资源表:

换句话说,由于我们使用了身份映射,所以可以在它们的物理地址处访问外围设备。

运行时检查DSPIOMMU页面表

可以使用以下命令转储DSPIOMMU页表:

一般来说,MMU0和MMU1的编程方式是相同的,所以您只需要查看其中一

个或另一个就可以理解给定DSP的映射。

The“da”(“deviceaddress")columnreflectsthevirtualaddress.Itisderivedfromtheindex

intothetable,i.e.theredoesnotexistaudanregisterorfieldinthepagetable.EachMBof

theaddressspacemapstoanentryinthetable.The“da”columnisdisplayedtomakeit

easytofindthevirtualaddressofinterest.

“da”(“设备地址”)列反映虚拟地址。它是从索引中派生的,即在页表中不存在

“da”寄存器或字段。地址空间中的每个MB映射到表中的条目。显示“da”,使其

易于找到感兴趣的虚拟地址。

“pte”(“页表项”)列可以根据上述表20-4进行解码。例如:

1:0x4a0000000x4a040002

0x4a040002向我们表明,它是一个基地址0x4A000000的超值。这给了我们一个16MB

的内存页面。注意后面重复的条目。这是MMU的要求。

为了充分理解CortexM4IPU子系统的内存映射,认识到存在两种不同/独立的

内存转换级别很有帮助。以下是TRM中的片段以说明:

CortexM4IPUPhysicalAddresses

ThephysicallocationwheretheM4code/datawillactuallyresideisdefinedby

theCMAcarveout.Tochangethislocation,youmustchangethedefinitionof

thecarveout.TheM4carveoutsaredefinedintheLinuxdtsfile.For

examplefortheAM57xxEVM:

CortexM4IPU物理地址

M4代码/数据实际所在的物理位置由CMAcarveout进行定义。要更改此位置,您必须更

改香芹的定义。M4carveout在LinuxDTS文件中定义。例如对于AM57XXEVM:

此外,当您更改carveout的位置时,必须对资源表进行相应的更改.首先,如果您正在

进行内存更改,您需要自定义资源表。资源表是一个大型结构,是物理内存和虚拟内存之

间的“桥”。此结构用于配置IPUxMMU(不是UniCacheMMU)。在文章IPC资源定制表中

提供了详细信息。创建自定义资源表时,必须将physmemIPCvring的地址更新为与相应

CMA相同的基地址。

CortexM4IPU虚拟地址

UniCacheMMU,

UniCacheMMU最接近CortexM4。它提供了一级地址翻译。UniCacheMMU

实际上是由CortexM4"自行编程"的。UniCacheMMU也被称为属性

MMU(AMMU)o有固定数量的小、中和大页面。以下是显示一些关键映射的片

段:

这3页是“身份”映射,对关联的地址范围执行请求通过。这些中间地址在下一

级翻译(IOMMU)中被映射到它们的物理地址。用于代码和数据的AMMU范围

需要是标识映射,因为否则RemoteProc加载器将无法与相关联的IOMMU映

射从ELF文件中匹配这些部分。这些映射应足以满足任何应用,即无需调整这

些映射。修改的更可能区域是下一节中的资源表。AMMU映射主要用于理解关

于CortexM4存储器映射的完整图像。

IOMMU

IOMMU位于离L3互连最近的地方。它获取来自AmMu的中间地址输出,并将其转换为

L3互连所使用的物理地址。IOMMU是由ARM基于相关资源表编写的。如果您正在计划

任何内存更改,那么您将需要创建一个自定义资源表,如页面IPC资源自定义表中所描述

的那样。

来自资源表的3个条目都来自相关联的IPUCMA池(即,如由类型_CARSOUT

所指示的)。第二参数表示虚拟地址(即对10MMU的输入地址)。这些地址必须

与AMMU映射以及链接器命令文件一致。来自IPC的EX02_MessageQ示例

在文件示例/Dra7xx_Linux_ELF/EX02_MessageQ/共享/c。nfig.bld.中定义了这

些内存部分您可以桢用以示命令卸载IPUIOMMU页面表:

示例:从IPU访问UART5在本例中,假定引导加载程序中已经设置了PIN-

MUXEDo如果不是这样,你就得在这做。UART5模块需要通过

CM_L4PER_UART5_CLKCTRL寄存器使能。这位于物理地址0x4A009870o

因止匕从M4,我们将在虚拟地址0X6A009870上对该寄存器进行编程。将值2

写入此寄存器将启用外围设备。在完成上一个步骤后,UART5寄存器将变为可

访问的。通常UART5可在物理基础地址0x48066000处访问。这将相应地从

IPU在0x68066000处访问。

默认情况下,IPU和DSP自动空闲。这可以防止您能够使用JTAG连接到设

备,也无法通过devme2访问本地内存。在sysfs中有一些选项是必要的,以

强制这些子系统运行,有时这是开发和调试目的所需要的。这些操作需要一些

源自设备树(dra7.dtsi)的硬编码设备名称:

RemoteCoreDefinitionindra7.dtsiSystemFSName

IPU1ipu@5882000058820000.ipu

IPU2ipu@5502000055020000.ipu

DSP1dsp@4080000040800000.dsp

DSP2dsp@4100000041000000.dsp

ICSS1-PRU0pru@4b2340004b234000.pru0

ICSS1-PRU1pru@4b2380004b238000.pru1

ICSS2-PRU0pru@4b2b40004b2b4000.pru0

ICSS2-PRU1pru@4b2b80004b2b8000.pru1

要将这些系统FS名称映射到关联的RemoteProc条目,您可以运行以下命令:

root@am57xx-evm:Is-1/sys/kernel/debug/remoteproc/

root@am57xx-evm:cat/sys/kernel/debug/remoteproc/remoteproc*/name

命令的结果将是一对一的映射。例如,58820000.ipu对应于remoteprocO。

类似地,要查看每个核心的电源状态:

root@am57xx-evm:~#cat/sys/class/remoteproc/remoteproc*/state

状态可以挂起、运行、脱机等。只有当状态“运行”时,才能附加JTAG。如果它显示为“暂

停”,则必须强制它运行。例如,假设DSP0被“挂起”。可以运行以下命令强制执行:

root@am57xx-evm:echoon>/sys/bus/platform/devices/40800000.dsp/power/control

任何核心都是如此,但是用上面图表中关联的系统FS名称替换

40800000.dsp»

AddingIPCtoanExistingTI-RTOSApplicationonslavecores

AddingIPCtoanexistingTlRTOSapplicationontheDSP

AcommonthingpeoplewanttodoistakeanexistingDSPapplicationand

addIPCtoit.ThisiscommonwhenmigratingfromaDSPonlysolutiontoa

heterogeneousSoCwithanArmplusaDSP.Thisisthefocusofthissection.

Inordertodescribethisprocess,weneedanexampletestcasetoworkwith.

Forthispurpose,we'llbeusingthe

GPIO_LedBlink_evmAM572x_c66xExampleProjectexamplethat'spartofthe

PDK(installedaspartoftheProcessorSDKRTOS).Youcanfinditat

c:\ti\pdk_am57xx_1_0_4\packages\MyExampleProjects\GPIO_LedBlink_evm

AM572x_c66xExampleProject.ThisexampleusesSYS/BIOSandblinksthe

USEROLEDontheAM572xGPEVM,it'slabeledD4ontheEVMsilkscreen

justtotherightoftheblueresetbutton.

将IPC添加到从内核上的现有TI-RTOS

应用程序将IPC添加到DSP上现有的TIRTOS应用程序上

人们想要做的一个常见的事情是采用现有的DSP应用程序,并将IPC添加到

它。当从DSP迁移到带有ARM+DSP的异构SoC时,这很常见。这是本部分

的重点。为了描述这个过程,我们需要一个示例测试用例来处理。为此,我们

将使用GPIO_LEDBLINK_EVMAM572X_C66XExample项目示例,该示例是

PDK的一部石(作为处理彝SDKRTOS的一部分安装)。您可以在

C:TiPDK_AM57xx_1_0_4PackageMyExample_GPIO_LEDBLINK_EVMAM57

2X_C66XExample项目'市找到它。此示例使用《YS/BIOS并将用声0闪烁在

AM572XGPEVM上,它在EVM丝印屏幕上标记为D4,恰好位于蓝色重置按

钮的右侧。

有几个步骤进行整个过程工作,每个步骤将在下面的章节中进行描述,并使用

代码编写器Studio(CCS)在EVM上运行“开箱即用"LED闪烁示例,从IPC软件

包获取EX02_消息示例,并将其转换为CCS项目。建立它并修改Linux启动

代码以使用此新映像。这只是一个明智的检查步骤,以确保我们可以在CCS

中构建IPC示例,并让它们在EVM启动时运行。在CCS中,进行开箱即用的

LED示例的克隆,并将其重命名为“S”示例的IPC版本。然后,使用

EX02_MessageQ示例作为参考,在IPC块中添力口至ULED示例。从CCS构建

然后将其添加到Linux固件文件夹中。

将IPC添加到LED闪烁示例第一步是克隆出开箱即用的LED闪烁CCS项目,并将其重

命名为使用IPC表示它。执行此操作的最简单方法是使用CCS。下面是步骤……在"编

辑”(Edit)透视图中,进入“项目浏览器”(ProjectExplorer)窗口,右键单击

GPIO_LEDBLINK_EVMAN572XC66XExampleProject项目,然后从弹出式菜单中选择"复

制”(Copy)。Maske确定项目不是关闭状态。Rick单击项目浏览器窗口的“In”和“空”区域,

然后选择“过去”。弹出对话框,修改名称以表示它使用IPC。一个好的名称是

GPIO_LEDBLINK_EVMAM572XC66XExamplejec_w让h」PC。

Thisistheprojectwe'llbeworkingwithfromhereon.Thenextthingwewanttodois

selecttheproperRTSCplatformandothercomponents.Todothis,followthesesteps.

右键单击GPIO_LedBlink_evmAM572xc66xExampleProjec_With_IPC项目并

在左侧窗格中选择Properties,单击CCSGeneral。在右侧,单击RTSC选项

卡上的XDCtools版本:在产品和存储库列表中选择6core,检查以

下.IPC4SYS/BIOS9am57xxPDK1.0.4forTarget,选择

ti.Targetts.e斤.C66作为平台,选择ti.platforms.evmDRA7XX,在平台被选中

后,编辑其名称BueHand并追加:dsp1到末尾。在此之后,应该是

ti.platforms.evmDRA7XX:dsp1,然后将构建配置文件设置为DEBUG。按下

OK按钮。

现在,我们希望将EX02_MessageQIPC示例的配置和源文件复制到我们的项

目中。IPC示例位于

C:TilPC_3_43_02_04ExampleDra7xx_Linux_ELFEX02_MessageQo要将文

件复制到&DS项目中,您可以简单地还择Windows资诲管理器中所需的文

件,然后将它们拖放到CCS中的项目中。将这些文件复制到CCS项目中……

人们想要做的一件常见的事情就是使用一个现有的IPU应用程序,它可以控制

串行或控制接口,并将IPC添加到其中,这样固件就可以从ARM加载。当从

唯一的IPU解决方案迁移到具有MPUSS(ARM)和IPUSS的异构SoC时,这

种情况很常见。这是本节的重点。为了描述这个过程,我们需要一个TIRTOS

测试用例来处理。为此,我们将使用属于PDK(安装为处理器SDKRTOS的一

部分)的UART_BasicExgrom_evmAM572x_m4ExampleProject示例。此示例

使用TIRTOS年在AM572xGPEVM上使吊UART3端口执行串行IO操作,

它在EVM屏幕上被标记为SerialDebugo

为使整个过程工作采取了若干步骤,每个步骤将在下面的章节中进行描述使用代码

ComposerStudio(CCS)构建并运行EVM上的开箱即用UARTM4示例从IPC软件包构建

并运行EX02_MessageQ示例,并将其转换为CCS项目。建立它并修改Linux启动代码

以使用此新映像。这只是一个明智的检查步骤,以确保我们可以在CCS中构建IPC示

例,并让它们在EVM启动时运行。在CCS中,进行开箱即用UARTM4示例的克隆,并

将其重命名为该示例的IPC版本。然后使用EX02_MessageQ示例作为参考,在IPC块

中添加到UART示例代码。从CCS构建然后将其添加到Linux固件文件夹中。

Linux内核启用所有配置所需的SOCHW模块。适当的驱动程序配置所需的时钟并初始化

HW寄存器。对于所有未使用的IP,没有配置时钟。使用设备树在内核中禁用uart3节

点。此外,这限制了内核将这些IP放到睡眠模式。

在每个IPU1和IPU2子系统中都有两个MMUoL1MMU称为IPU_UNICACHE_MMU

或AmMu和L2MMU。关于如何在IPC-Remoteproc中配置这一点的说明已在

Changing_Cortex_M4_IPU_Memory_Map一节中进行了描述。IPC处理L1和L2MMU

不同于PDK驱动程序示例如何使用这些MMU设置内存访问,用户在集成组件时需要管理

这些MMU。这种差异突出如下:

IPU

AMMU

AMMUsettingisconfiguredusing

(LIMMU)TlRTOSconfigurationfile(.cfg)

9

L2MMUL2MMUisconfiguredusbgresource

tableprovidedinIPC-remoteproc

(IPUMMU)

13andL4Peripherals

andsystemNitercomect

PDK示例将地址(0x4X000000)用于外围寄存器,并使用以下MMU设置L2MMU使用默

认1:1映射AmmuConfiguration将物理0x4X000000访问转换为逻辑0x4X000000

IPC远程procARMM4要求IPU使用逻辑地址(0x6X000000),并使用以下MMU设置L2

MMU,使MMU将0x6X000000访问地址转换为地址0x4X000000(配置为1:1映射和

0x6X000000)

因此,在将IPC与PDK驱动程序集成之后,建议使用别名地址来访问外围设

备和PRCM寄存器。这需要更改PDK驱动程序和应用程序代码中使用的地

址。然后对IPU应用程序源代码进行以下更改:

将UART_SOC.G文件添力口至I」项目中,并修改UART_HATTRS中所有

IPUUAR〒寄存器实例的基本地址,以使用别名地址:

添加自定义SOC配置还意味着您应该使用通用的UART驱动程序,而不是内

置在SOC设置中的驱动程序。要执行此注释,请在.cfg中使用以下行:

在应用代码中也有一个实例,在该实例中,我们将指针添加到需要改变如下的PRCM寄存

器。

现在,您已经准备好构建固件。构建.out之后,将扩展名更改为.xem4,并将其复制到用

于加载M4固件的文件系统中的位置。

ARM-DSP通信的多种方式

本文档描述了TI多核设备上的通信方式。应用程序中的单个核心可以承担主机

/设备或主/从的角色。这里的讨论假设主机/主集群是运行SMP/Linux的ARM

集群,而设备/从服务器是运行TI-RTOS的C6xxDSP集群。

OpenCL

OpenCL是一个框架,用于编写跨异构系统执行的程序,以及用于表示跨异构设备分派并

行计算的程序。这是一个开放的,没有版税的标准,由Khronos财团管理。在异构SoC

上,OpenCL将其中一个可编程核心视为主机,将其他核心视为设备。运行在主机(即主机

程序)上的应用程序管理设备上代码(内核)的执行,并且还负责使数据可供设备使用。设备

由一个或多个计算单元组成。在ARM和DSPSoC上,每个C66XDSP都是一个计算单

元。OpenCL运行时由两个组件组成:(1)用于主机程序创建和提交内核以供执行的API:

(2)用于表示内核的跨平台语言一OpenCLC--它基于C99C,并附加和限制了OpenCL支持

数据并行和任务并行编程范例。数据并行执行使设备上的计算单元并行执行。任务并行执

行允许向每个计算单元异步分派任务。有关更多信息,请参阅OpenCL用户指南。

从运行Linux或RTOS的ARM至ijDSP的卸载计算

优点

方便设备之间的移植,不需要理解内存体系结构,不需要担心MPAX和MMU,不需要担

心一致性,不需要在ARM和DSP之间建立/配置/使用IPC,无需成为DSP代码、体系结

构或优化方面的专家

缺点:不能控制系统内存布局等,以处理优化的DSP代码

DCE(DistributedCodecEngine)分布式编解码引擎

DCE框架为用户在设备(如AM57XX)上编写应用程序提供了一种简单的方法,该设备具有

用于图像和视频的硬件加速器。它为从核上的音频和视频编码和解码提供了对硬件加速的

远程访问。基于ARM用户空间GStreer的多媒体应用程序使用GStreer库加载并与TI

GStreer插件接口,该插件处理硬件加速器所特有的所有细节。插件接口libdce模块,它

提供ARM用户空间API。Libdce在ARM上使用RPMSG框架,与从核上的对应方通

信。在从核上,采用编解码引擎和帧组件在IVA上进行视频/图像编解码处理。

MPUSubsystem

Cortex-A15

V一

OMAPDRMA

H

D

C

o

d

e

c

s

OMAPDSS

LinuxOperatingSystemKernelSYS/BIOSRTOS

使用DCEA57xx作为示例的多媒体软件堆栈的概述具有以下加速器

图像和视频加速器(IVA)

视频处理引擎(VPE)

用于卸载特定图像/视频和/或语音/音频处理的C66XDSP内核

用户可以利用开源元素来提供诸如AVI流解码和音频编解码等功能。这些元素以及TI处理

器LinuxSDK中基于ARM的GStreer插件提供了加速器卸载的摘要。

在AM57xx中,硬件加速器具有以下功能:

用于多媒体加密和解码的IVA视频解码:H264、MPEG-4、MPEG2和VC1

视频编码:H264和MPEG-4

图像解码:MJPEGVGE用于视频操作,例如缩放、颜色空间转换和去隔行以

下格式:支持的输入格式:NV12、YUYV、UYVY

支持的输出格式:NV12、YUYV、UYVY、RGB24、ArgB24,和ABGR24用

于卸载信号处理的DSP集成在DSPGStreamer插件中的示例图像处理内核:

MEDIAN2X2,MEDIAN3X3,SOEL3X3.CONV5X5、CY

音频/视频或专用编解码器对从内核的卸载处理

优点:

加速多媒体编解码处理,

简化了与GStreer和TIGStreer插件接口时多媒体应用程序的开发。

缺点

不适用于非编解码器算法

需要工作来添加新的编解码器算法

需要对DSP编程的知识

BigDataIPC

大数据是TlIPC实现的一个特殊用例,用于高性能计算应用程序和其他数据密集型应用程

序,这些应用程序通常需要在SoC中的多核处理器之间传递大数据缓冲区。大数据IPC

提供了一个高级抽象来处理大数据缓冲区上的地址转换和缓存同步。

ARM与DSP之间的大小大于512字节的报文/数据交换

优化

能够处理大于512字节的数据

缺点

需要了解DSP内存体系结构

需要了解DSP的配置和编程

TI专利API。

IPC

处理器间通信(IPC)是为方便进程间通信而设计的一组模块.通信包括消息传

递、流和链接列表。这些模块提供服务和功能,可用于多处理器环境下ARM

和DSP处理器之间的通信。

IPC模块初始化IPC的各个子系统,并同步多个处理器。

MessageQ模块支持可变长度消息的结构化发送和接收。

ListMP模块是一个基于链表的模块,旨在提供不同处理器之间的通信方式。它使用共享内

存为多个处理器提供共享、传递或存储数据缓冲区、消息或状态信息的方法。

HeapMP模块提供3种类型的内存管理、固定大小的缓冲区、多个不同的固定大小缓冲区

和可变大小的缓冲区.

GateMP模块通过其实例执行本地和远程上下文保护。通知模块通过硬件中断管理软件中

断的复用/解复用。

SharedRegion模块设计用于多处理器环境中,其中存在跨不同处理器共享和访问的内存

区域。列表模块支持创建双链接的对象列表,MultiProc模块在多处理器环境中将处理器

ID管理集中到一个模块中。

NameServerModule管理本地名称/值对,这使得应用程序和其他模块能够基于名称来调整

和检索值。

ARM与DSP之间的消息/数据交换

优点:

适合那些熟悉dsp编程

dsp代码优化的人。

缺点:

需要有关dsp内存结构的知识,

需要了解dsp的配置和编程消息大小

仅限于512字节

TI专有api。

ProsandCons

ProsCons

EasyportingNoDSPprogrammingCustomerdon'thavecontrolovermemorylayoutetc.

StandardOpenCLAPIstohandleoptimizeDSPcode

AcceleratedmultimediacodecNotmeantfornon-codecalgorithmsNeedworkto

DCEhandlingSimplifiesdevelopmentaddnewcodecalgorithmsCodeclikeAPIsRequire

wheninterfacingwithGStreamerknowledgeofDSPprogramming

FullcontrolofDSPconfiguration

CapableofDSPcodeoptimization

BigNeedtoknowmemoryarchitectureNeedtoknowDSP

Notlimitedtothe512bytebuffer

DataconfigurationandprogrammingTlproprietaryAPI

sizeSameAPIsupportedonmultiple

Tlplatforms

FullcontrolofDSPconfiguration

NeedtoknowmemoryarchitectureNeedtoknowDSP

CapableofDSPcodeoptimization

IPCconfigurationandprogrammingLimitedtosmall

SameAPIsupportedonmultipleTl

messages(lessthan512bytes)TlproprietaryAPI

platforms

优点缺点

OpenCL易于移植客户不控制内存布局等。

无DSP处理优化DSP代码的步骤

编程标准OpenCLAPI

DCE加速多媒体编解码器处理不适用于非编解码算

简化了与GStreamer接口时的开发。法,

需要工作来添加新的编

解码算法,

像api这样的编解码算

法需要dsp编程知识。

BigData完全控制DSP配置,需要知道内存体系结构

能够进行DSP代码优化,需要知道DSP配置和编

不限于512字节缓冲区大小,程

在多个TI平台上支持相同的API。TI专有API

IPC支持在多个Tl平台上需要知道内存体系结构

支持的DSP代码优化需要知道DSP的配置和对

相同API的DSP配置的完全控制小消息(小于512字节)

TI专有API的编程限制

决策

在作出使用ARM/DSP通信方法的决策时,提供了以下简单流程图作为参考。

在决策过程中还需要考虑硬件能力,如在使用DCE时存在图像和视频加速

器。

OpenCL

TlOpenCLv01.01.xxUser'sGuide

介绍

OpenCL是一个用于编写跨异构系统执行的程序的框架。本文档描述KhronosOpenCL

1.1规范的TI实现。以下系统目前支持德州仪器OpenCL实现:

SoCSystemKhronosConformanceInstallationInstructions

AM572AM572EVMOpenCLv1.1ConformantProcessorSDKforAM57x

OpenCL规范定义了具有主机和计算设备的平台模型。下表定义了用于TIOpenCL实现的

主机和计算设备:

SystemHostComputeDevice

1devicewith2C66xDSPcompute

AM572EVM2ARMCortex-A15CPUs,SMPLinux

units

OpenCL是由Khoros集团维护的开放标准。TI的OpenCL实现符合OpenCI_1.1标准。

通用OpenCL1.1文档适用于TI的实现。

使用OpenCLTM在Sitara™AM572x处理器上卸载C66xDSP

传统上,客户采用复杂的ARMC66x数字信号处理器(DSP)芯片上系统(SoC)的编程方

法,例如TI的Sitara™AM57xSoC,着重于手动将应用程序划分到ARM核和DSP之

间,并手动优化给定核的应用程序的适当部分。这种方法往往会产生最大的权限,但也有

缺点;-由于程序员需要管理调度、通信和同步机制,因此不能轻易地将其从一个TISoC

移植到另一个TISoC,而将其用于市场的时间也会增加。为了为客户提供一种替代方案,

TI已经启用了行业标准的异构多核编程模型,例如OpenCL和OpenMP卸载在ARM

DSPSoC上。这篇文章将重点介绍OpenCL和TI的实现。在稍后的文章中,我将写关于

OpenMP卸载的文章。

OpenCL是一种用于表示跨异构设备调度并行计算的程序的框架。它是由Khornos财团管

理的开放、免版税的标准。在异构SoC上,OpenCL将可编程内核之一作为主机和其他内

核视为设备。例如,在SITARAAM572XSOC中,主机是运行SMP/Linux或TI-RTOS的

ARM®Cortex3A15群集,并且该设备是C6xxDSP群集。在主机上运行的应用程序(即主

机程序)管理设备上的代码(内核)的执行,并且还负责向设备提供可用的数据。设备由一个

或多个计算单元组成。在SITARAAM572XSOC上,每个C66xDSP是一个计算单元。

OpenCL运行时由两个组件组成:(1)用于主机程序创建和提交内核以供执行的API和(2)用

于表达内核的跨平台语言-OpenCLC-基于C99C,一些添加和限制OpenCL支持数据并行

和任务并行编程范例。数据并行执行对设备上的计算单元执行并行化。任务并行执行支持

将任务异步分派给每个计算单元。

以下是SitaraAM572xSoC的TIOpenCL实现的几个关键特征:主机是运行SMP/Linux的

dualCortex-A15群集一个具有一个或两个C66xDSP内核的设备(可通过环境变量配置)

计算单元是单个C66xDSPOpenCL实现符合V1.1(完整配置文件)不支持图像,“双”支

持为扩展,不包括在一致性提交中.

OpenCLHostOpenCLDevice

Computeunit

LocalMemory

•128KBaccessibleby

kernelsonDSPsvia

OpenCLlocal

,128Kcache

(configurable)

•32Kusedbyruntime

Globalmemory

・160MB

availablefor

OpenCL

(configurable)

DDR(2GBonEVM)

TI对OpenCL的扩展

ti使OpenCL的各种扩展能够利用其SoC上的特性,利用现有的C66xDSP代码库,使

它们更易于使用。以下是此类扩展的一些例子:

从OpenCLC代码调用标准C代码,包括OpenMP实用主义代码

使用OMCRAM的片内全局缓冲器

_malloc_DDR和_malloc_mSMC替代malloc(如OpenCL2.0SVMalloc)

启用零复前缓冲能力支持OpenCL中C66xDSP固有功能,如_DCMPY,

_DOTPSU4,

ETC等来自OpenCLC的printf(类似于OpenCLI.2printf的功能)

使用EDMAMGRAPI函数

从OpenCLC访问EDMA功能

从OpenCLC缓存DSP的L1D和L2缓存的缓存大小和控制操作附加

OpenCLC

内置函数、—clock、_cycle_delay等。

为什么使用OpenCL?

使用标准方法编程异构SoC简化了编程;它允许程序员使用标准的、有记录的API来处

理调度代码和数据到DSP的机制,并将重点放在优化调度代码上。其他好处包括:

TISOCS之间的应用程序无缝迁移-例如,使用8个C66xDSP内核编写的OpenCL应用程

序写入66ak2hSOC,并在具有两个C66xDSP内核的AM572xSoC上运行该应用程序,

仅需重新编译。

OpenCL的TI扩展使程序员能够利用优化的TI-提供的DSP库,如DSPUB、MathLib、

ImageLib

使用DSP在开源库(如OpenCV)中卸载计算

OpenCL何时应用?

OpenCL是针对一个场景设计的,其

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论