多核编程指南(十二)---DSP代码和Data镜像

为了更好地支持多核设备的配置,理解如何定义软件项目和操作系统分区非常重要。

在任何多核SOC的SYS/BIOS配置中,local L2内存(LL2RAM)和共享二级内存(SL2RAM)都有单独的内存部分。根据应用程序在多个核心之间的通用性,需要不同的配置来最小化操作系统和应用程序在设备内存中的占用空间。

Single Image

单个镜像应用程序在所有内核之间共享一些代码和数据内存。这种技术允许完全相同的应用程序在所有内核上加载和运行。如果运行完全共享的应用程序(当所有内核执行相同的程序时),设备只需要一个项目,同样,只需要一个SYS/BIOS配置文件。如前所述,代码和链接器命令文件有一些注意事项:

  1. 代码必须为驻留在共享L2或DDR SDRAM中的唯一数据段设置指针表
  2. 编程DMA通道时,代码必须将DNUM添加到任何数据缓冲区地址
  3. 链接器命令文件应仅使用别名地址定义设备内存映射

Multiple Images

在这个场景中,每个核心运行一个不同的独立应用程序。这需要为放置在共享内存区域(L2或DDR)中的任何代码或数据分配一个唯一的地址范围,以防止其他内核访问同一内存区域

对于此应用程序,每个应用程序的SYS/BIOS配置文件都会调整内存段的位置,以确保多个内核无法访问重叠的内存范围。

使用要复制代码,每个核心都需要一个专用项目或至少一个专用链接器命令文件。链接器输出需要将所有节映射到唯一的地址,这可以通过对所有节使用全局寻址来完成。在这种情况下,不需要别名,DMA使用的所有地址都与每个CPU使用的地址相同。

Multiple Images with Shared Code and Data

在此场景中,运行在不同内核上的不用应用程序共享一个代码映像。在多个应用程序之间共享代码可以减少总体内存需求,同时仍然允许不同的内核运行独特的应用程序。

这需要将用于单个镜像和多个镜像的技术结合起来,这可以通过使用部分链接来实现。

从部分链接的镜像生成的输出可以与其他模块或应用程序再次链接。部分链接允许程序员对大型应用程序进行分区,分别链接每个部分,然后将所有部分链接在一起以创建最终的可执行文件。TI代码生成工具的链接器提供了一个选项(-r)来创建部分镜像。-r选项允许镜像与最终应用程序再次链接。

使用-r链接器选项创建部分镜像时有一些限制:

  1. 条件链接已禁用,内存需求可能会增加
  2. Trampolines是禁用的。所有代码都需要在21位的边界
  3. .cinit和.pinit不能放置在部分镜像中

部分镜像必须位于其共享内存中,以便所有内核都可以访问它,并且它应该包含除.hwi_vec之外的所有代码(.bios、.text和任何自定义代码部分)。它还应该包含SYS/BIOS代码在同一位置所需的常量数据(.sysinit和.const)。镜像被放在一个固定的位置,最终应用程序将与之链接。

由于SYS/BIOS代码包含数据引用(.far和.bss sections),因此这些sections需要由链接到此部分映像的不同应用程序放置在非共享内存中的相同内存位置。ELF格式要求.neardata和.rodata sections与.bss放在同一节中。为了使其正常工作,每个核心必须放在同一地址位置有一个非共享内存部分。

Device Boot

如前面所述,可能会有一个或多个项目及其结果,在软件开发中用于单个设备的.out文件输出,具体取决于共享部分和独立部分的混合。不管有多少个.out文件的创建,应该为最终映像生成一个引导表,以加载到最终系统中。

TI有几个实用程序来帮助创建单个引导表。下图展示了如何使用这些使用程序从三个独立的可执行文件构建一个引导表的示例:
在这里插入图片描述
一旦创建了一个引导表,就可以用它来加载整个DSP镜像。如前所述,有一个单一的全局内存映射,允许一个简单的引导过程。所有部分按照其全局地址的定义进行加载。

引导顺序由一个内核控制。设备复位后,Core0负责在引导映像加载到设备后释放所有复位内核。使用单个引导表,Core 0能够在单个设备上加载任何内存,用户无需特别关注多个内核,只需确保代码在内存映射中正确加载到所有内核的起始地址(这是可以配置的)

Multicore Application Deployment(MAD) Utilities

多核软件开发工具包(Multicore Software Development Kit,MCSDK)提供了多核设备上部署应用程序的工具

The MAD Utilities

MAD实用程序提供了一套构建和运行时用于部署应用程序的工具

  1. 构建时实体

    Static Linker:用于链接应用程序和相关的动态共享对象(DSO)
    Prelink Tool:用于将ELF文件中的段绑定到虚拟地址
    MAP Tool:多核应用预链接器(Multicore Application Prelinker,MAP)工具,用于为多核应用的段分配虚拟地址

  2. 运行时实体

Intermediate Bootloader:提供将只读存储器文件系统镜像下载到设备共享外部存储器(DDR)的功能
Mad Loader:提供在给定核心上启动应用程序的功能

参考文献:

  1. 《Mullticore Programming Guide》

猜你喜欢

转载自blog.csdn.net/Xiao_Jie123/article/details/120225987