用来装载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:释放临时指针。