多核编程指南(十一)---内存管理(三)

Peripheral Drivers

所有外围设备都是共享的,任何核心都可以随时访问任何外围设备。初始化应该在引导过程中发生,可以直接通过外部主机、I2C EEPROM中的参数表,也可以通过应用程序代码本身中的初始化序列(仅一个内核)。对于所有运行时控制,由软件决定特定内核何时初始化外围设备。

一般来说,直接从内存位置读写的外围设备使用内置在外围设备中或由EDMA控制器(取决于设备)提供的通用DMA资源。基于路由方案发送或接收数据的外围设备使用多核导航器(Multicore Navigator),并具有PKTDMA实例。

因此,当使用诸如SRIO类型9或类型11的路由外围设备或NetCP以太网协处理器时,可执行文件必须初始化外围设备硬件、与外围设备关联的PKTDMA以及外围设备和路由方案使用的队列

每个路由外围设备都有专用的传输队列,这些队列硬连接到PKTDMA;当描述符被推入这些TX队列中时,PKTDMA会看到一个挂起的信号,提示它弹出描述符,读取描述符链接到缓冲区(如果是主机描述符),将数据转换为比特流,发送数据,并将描述符回收到空闲描述符队列。请注意,所有向外围设备发送数据的内核都使用相同的队列。通常每个发送队列都链接到一个通道。例如,SRIO有16个专用队列和16个专用通道,其中每个队列硬连接到一个通道。如果外围设备根据其通道号设置优先级,则将描述符推送到不同队列会导致传输数据的优先级不同。

虽然外围设备的传输队列是固定的,但可以根据通知内核描述符可用于处理通知的方法,从通用队列集或特殊队列集中选择接收队列。对于拉取方法,可以使用任何通用队列。应使用特殊中断队列以获得最快响应。累积队列用于减少延迟通知方法的上下文切换。

应用程序必须配置路由机制。例如,对于NetCP,用户可以基于L2、L3或L4层或上述任意组合来路由分组。应用程序必须配置NetCP引擎以路由任何包。要将包路由到特定的核心,必须将描述符推入与该核心相关联的队列中。SRIO也是如此;应用程序必须配置例程信息、ID、邮箱和信件(类型11)以及流ID(类型9)。

直接使用内存位置的外围设备(SRIO directIO、HyperLink、PCI express)具有内置DMA引擎,可在内存之间移动数据。当数据在内存中时,应用程序负责分配一个或多个内核来访问数据

对于设备PKTDMA或内置DMA引擎上的每个DMA资源,软件体系结构确定给外围设备所有资源是由单个核心控制(主控制)还是每个核心控制自己的(对等控制)。如上所述,对于TCI66XX或C66XX,所有外围设备都具有多个DMA通道上下文,作为PKTDMA引擎或DMA内置引擎的一部分,该引擎允许对等控制而无需仲裁。每个DMA上下文都是自治的,不需要考虑原子访问。

由于内核的子集可以在运行时重置,因此应用软件必须拥有重置内核的重新初始化,以避免中断未重置的内核。这可以通过让每个核心检查它正在配置的外围设备的状态来实现。如果外围设备未通电且未启用发送和接收功能,则内核将执行通电和全局配置。如果两个内核在断电时读取外围状态并开始通电序列,则此方法中存在固有的争用条件,但这可以通过使用共享内存控制器(SMC)中的原子监视器或其他同步方法(信号量和其他)来管理

主机控制方法允许将设备初始化决策推迟到DSP之外的更高层。当核心需要访问外围设备时,由上层指示是执行全局初始化还是本地初始化。

Data Memory Placement and Access

数据的存储器选择主要取决于数据的传输和接收方式以及CPU对数据的访问模式/定时。理想情况下,所有数据都分配给L2 SRAM。然而,内部DSP内存中通常存在空间限制,需要一些代码和数据驻留在DDR3 SDRAM(片外)。

通常,运行时关键功能的数据位于分配数据的核心的本地二级RAM中,非时间关键数据(如统计数据)被推送到外部内存并通过缓存访问。当运行时数据必须放在芯片外时,通常首选使用EDMA和ping-pong缓冲区结构在外部存储器和二级SRAM之间移动数据,而不是通过缓存访问。权衡仅是控制开销与性能,尽管即使通过缓存访问数据,软件中也必须保持与外部内存之间的任何数据DMA的一致性。

参考文献:

  1. 《Multicore Programming Guide》

猜你喜欢

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