DSP

openMPM源码分析(七)

2019-07-13 19:21发布

用来装载DSP的镜像的主程序在:src/clien/mpmcmdif.c中,对应的/bin/mpmcl的源码。下面开始分析。 一、参数个数和内容的分析。      1.通过argc的值和!strcmp(argv[x],"CMD");来进行判断(当模式串匹配时strcmp返回为0,故在if条件判断中要使用 !strcmp() )。      2.具体参数的内容在函数void print_help(char * progname);中体现。   二、装载DSP镜像函数 mpm_load();      1.函数原型:int mpm_load(const char* slave_name,const char *file_name,int * error_code)      根据注释:此处的file那么就是DSP image。      2.函数内容:抛开变量先不看,又是一连串7个if语句,他们做的事情如下:           a.判断slave_name和file_name是否为空。           b.slave_name的长度不得超过最大长度32(MPM_MAX_NAME_LENGTH)           c.char *realpath(const char*path,char*resolved_path)将path所指的相对路径转换为绝对路径存储在resolved_path所指的数组或指针中。           d.msg_alloc(c2s,strlen(resolved_path)+1);为c2s指针分配并初始化一个(sizeof(c2s)+strlen(resolved_path))长度的空间,令c2s->length=strlen(resolved_path)           注:c2s指针和s2c指针分别指向client_to_server_msg_t和server_to_client_msg_t结构体。           对c2s指针初始化:                     1.由于是mpm_load()函数,所以c2s->cmd=mpm_cmd_load;                     2.初始化c2s->slave_name                     3.初始化c2s->length
          e.函数:int send_n_recv_msg(char* send_data, int send_data_length, char** recv_data, int * recv_data_length);                函数内部做了两层封装,底层是用socket实现,而该函数完成了发送和接收两个功能。其实就是对s2c和c2s这两个指针的内容进行交互。
          f.经过上步s2c指针指向内容的成员变量经过了初始化,对s2c指针及其内容进行判断(指针是否为空等)。           g.根据s2c指针所指向的内容获取相关的信息(error信息,length信息)
     3.close_n_exit:释放临时指针。