openMPM源码分析(一)

  1. openMPM简介
    1. MPM全称Multiple Processor Mannager主要用来从ARM载入和运行DSP镜像。
    2. 底层通信由UNIX域实现,分为MPM server 和 MPM client两个组件,前者作为守护进程自动运行在默认文件系统来解析/etc/mpm/mpm_config.json文件(mpm config 文件),然后等待丛核的UNIX域套接字。后者安装在文件系统,它通过命令行来访问server。
  2. ARM与DSP的同步
    1. ARM代码test/sync_test/host/src/main.c
    2. DSP代码test/sync_test/c66x/src/main.c
  3. test/sync_test/c66x/src/main.c源码分析
    1. extern cregister volatile unsigned int DNUM;
      1. cregister是DSP中关键字,用来定义直接访问CPU控制寄存器的变量(在user mode下)通过读取寄存器DNUM的值即可获得当前coreID。DNUM在c6x.h中定义。
    2. sync_test_shmem_t *sync_test_shmem;<span style="font-family: 微软雅黑; text-align: -webkit-auto; background-color: rgb(255, 255, 255);"> </span>
      1. sync_test_shmem_t变量类型定义在test/sync_test/inc/sync_test.h中是一个包含两个成员变量的结构体:
      2. 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 //表示最大从核数。
    3. main函数中
      1. sync_test_transport_open()函数,主要工作是对MARn寄存器进行初始化为0。
      2. MARn简介
        1. n取值0-255其中每个MARn是一个32位寄存器,31-4位作为保留位,3位是PFX位,2&1为保留位,0位是PC位。地址从01848000h开始,表示MAR0定义为本地L2的RAM地址。
        2. L2控制器提供的寄存器,它用来管理特定范围的内存。
          1. PC位:0---不可缓存,1---可缓存
          2. PFX位:0--不可预取,1---可预取
        3. 主要实现2个bit。PC和PFX(分别是0位和3位)
        4. MAR0到MAR11为只读寄存器。
        5. 函数中MAR160-MAR191初始化为0表示范围A0000000h-BFFFFFFFh的内存不可缓存。
      3. 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自己访问。

你可能感兴趣的:(dsp,openMPM,c66x)