openMPM源码分析(一)
2019-07-13 16:26发布
生成海报
- openMPM简介
- MPM全称Multiple Processor Mannager主要用来从ARM载入和运行DSP镜像。
- 底层通信由UNIX域实现,分为MPM server 和 MPM client两个组件,前者作为守护进程自动运行在默认文件系统来解析/etc/mpm/mpm_config.json文件(mpm config 文件),然后等待丛核的UNIX域套接字。后者安装在文件系统,它通过命令行来访问server。
- ARM与DSP的同步
- ARM代码test/sync_test/host/src/main.c
- DSP代码test/sync_test/c66x/src/main.c
- test/sync_test/c66x/src/main.c源码分析
extern cregister volatile unsigned int DNUM;
- cregister是DSP中关键字,用来定义直接访问CPU控制寄存器的变量(在user mode下)通过读取寄存器DNUM的值即可获得当前coreID。DNUM在c6x.h中定义。
sync_test_shmem_t *sync_test_shmem;
- sync_test_shmem_t变量类型定义在test/sync_test/inc/sync_test.h中是一个包含两个成员变量的结构体:
typedef struct{
int32_t num;
int32_t user[SYNC_TEST_MAX_NUM_SLAVES + 1];
}sync_test_shmem_t;
#define SYNC_TEST_MAX_NUM_SLAVES 8 //表示最大从核数。
- main函数中
- sync_test_transport_open()函数,主要工作是对MARn寄存器进行初始化为0。
- MARn简介
- n取值0-255其中每个MARn是一个32位寄存器,31-4位作为保留位,3位是PFX位,2&1为保留位,0位是PC位。地址从01848000h开始,表示MAR0定义为本地L2的RAM地址。
- L2控制器提供的寄存器,它用来管理特定范围的内存。
- PC位:0---不可缓存,1---可缓存
- PFX位:0--不可预取,1---可预取
- 主要实现2个bit。PC和PFX(分别是0位和3位)
- MAR0到MAR11为只读寄存器。
- 函数中MAR160-MAR191初始化为0表示范围A0000000h-BFFFFFFFh的内存不可缓存。
- sync_test_get_cfg()函数,主要工作是获取当前DSP核数。其中SYNC_TEST_CFG_BASE为0x00800000在test/sync_test/inc/sync_test.h中定义,查阅资料知:对于C6678来说,例如每个core有8个L2(512K)即8*512K作为全局地址,而所有的core一个私有的地址从00800000h开始(每个核是一样的),私有的地址,只能被core自己访问。
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮