openMPM源码分析(四)

来源:互联网 发布:网络写手如何赚钱 编辑:程序博客网 时间:2024/04/30 08:44
今天分析host/src/main.c中的内容。
其中主要涉及到一个transport库,在mcsdk安装目录下递归查询并没有找到有关mpm_transport的东西,但在main.c中有#include <mpm_transport.h>语句。
最终在GITORIOUS@TI中找到,git地址:git://git.ti.com/keystone-linux/mpm-transport.git。
由此对main.c进行分析:
首先是函数int32_t sync_test_transport_open(int32_t num_dsps);
里面主要包涵函数:
一、函数mpm_transport_h mpm_transport_open(char* slave_name,mpm_transport_open_t* cfg)
这里  #define mpm_transport_h void*
进入函数内部,先不管局部变量,一连9个if判断,他们做的事情分别是:
1.传进来的参数如果为空返回并打印消息。
2.丛核名不得大于MPM规定最长名字长度(#define MPM_MAX_NAME_LENGTH 32)
3.为sp指针分配空间并初始为0(calloc与malloc的区别)
这里sp的类型为mpm_transport_cfg_t * 该结构体中成员变量较多,与.json文件中的配置相关。
4.  只读的方式打开mpm_config.json文件(打开路径为/etc/mpm/mpm_config.json)该文件位于mpm_transport/scripts目录下。
5.以flen变量获取该文件的大小。
6.并为config_buf分配该大小的空间(char*)并初始化为0。
7.将mpm_config.json中的内容read到上述config_buf里面。
8.对config_buf的内容进行解析(cJSON_Parse)返回到json中(cJSON指针)
9.以json、slave_name、sp为参数调用json_get_slave_info函数,这个函数将一些信息及配置返回到sp指针中。
以上9步算完成了一次初始化工作。
接下来的一个switch case (sp->transport )主要是依据上一步返回的指针进行相应的操作
transport成员是一个mpm_transport_e类型的枚举,其定义如下:
typedef enum mpm_transport_tag{
          shared_memory,
          srio,
          pcie,
          hyperlink,
          ethernet,
}mpm_transport_e;
最后一个工作就是对申请的空间打开的文件等等进行delete操作。最后的返回值为sp指针。

二、3个函数
int32_t sync_test_lock_create(int32_t num_dsps);
int32_t sync_test_barr_create(int32_t num_dsps);
int32_t sync_test_shmem_create(int32_t num_dsps);
在这三个函数里面主要是以各自在内存的物理地址和大小进行mmap申请虚拟地址。
注:
#define SYNC_TEST_SHMEM_BASE     0xA000 0000
#define SYNC_TEST_BARR_BASE          0xA000 1000
#define SYNC_TEST_LOCK_BASE          0xA000 2000
通过mpm_transport_mmap()进行mmap操作。在此函数中依据(mpm_transport_cfg_t*)sp->transport的值分别操作:
mpm_transport_sharedmem_mmap()
mpm_transport_hyplnk_mmap()

三、int32_t sync_test_slave_config(int32_t num_dsps)
涉及的数据结构为:
mpm_transport_write_t(未用上)
sync_test_cfg_t 该数据结构中只包含一个成员变量(num_dsps)
将test_cfg写入共享内存中,这样在C66x/main.c中通过直接访问SYNC_TEST_CFG_BASE内存空间,即可获得num_dsps

四、3个函数
sync_test_barr()
sync_test_lock()
sync_test_barr()
与之前在c66x/main.c中的函数一样。

五、打印结果
void sync_test_print_results(void)

0 0
原创粉丝点击