Shared Code Program Memory Placement
当CPU从共享代码映像执行时,务必注意管理本地数据缓冲区。用于堆栈或本地数据表的内存可以使用别名地址,因此对于所有核心都是相同的。此外,任何用于暂存数据的L1D SRAM(使用IDMA从L2 SRAM进行分页)都可以使用别名地址。
如前所述,DMA主机必须为任何内存传输使用全局地址。因此,在任何外设中编程DMA上下文,代码必须将核心(DNUM)插入地址
为了在KeyStone系列设备的内核之间划分外部内存部分,应用程序使用MPAX模块。使用MPAX,具有32位本机寻址的KeyStone SoC可以寻址64GB的内存空间,可使用36位地址寻址。KeyStone SoC中有多个MPAX单元,允许将SoC的所有主机的地址转换为共享内存,如MSM SRAM和DDR内存。C66 CorePac使用其自己的MPAX模块将32位地址扩展到36位地址,然后将其呈现给MSMC模块。MPAX模块使用MPAXH和MPAXL寄存器对每个主机进行地址转换。
Using the Same Address for Different Code In Shared Memory
正如前面提到的Keystone系列的设备,每个核心的XMC都有16个MPAX寄存器,用于将32位逻辑地址转换为36位物理地址。此功能使应用程序能够在所有内核中使用相同的逻辑内存地址,并将每个内核的MPAX寄存器配置位指向不同的物理地址
Using a Different Address for the Same Code In Shared Memory
如果应用程序为每个核心使用不同的地址,则必须在初始化时确定每个核心地址,并将其存储在指针中(或在每次使用时计算)。
程序员能使用下面公式:base arrdress + per-core-area size * DNUM
这可以在启动时完成,也可以在计算指针并将其存储在本地L2中的线程创建时完成。这允许通过该指针的其余处理独立于核心,因此在需要时总是从本地L2检索正确的唯一指针。
因此,可以使用本地L2内存创建共享应用程序,这样每个核心都可以在不了解多核系统的情况下运行相同的应用程序(这种知识只存在于初始化代码中)。线程中的实际组件并不知道它们正在多核系统上运行
对于KeyStone系列设备,可以将每个CorePac内的MPAX模块配置为共享内存中相同程序代码的不同地址
参考文献
- 《Multicore Programming Guide》