好久没更博了,学车期间摸出一篇博文也是不容易,下面开始正题。
test下sync_test部分已经告一段落,接下来是test下filetest的内容。
test/filetestdemo/c66x/demo_loopback/src/main.c
在main函数中主要是两个函数:
1. demo_disableCache();
2. demo_loopback_test();
第一个函数很简单,在之前的笔记中分析过,主要是通过配置MARn(Memory Attribute Register)来控制相应内存范围是否可缓存(此处配置为non-cacheable)。
第二个函数在文件test/filetestdemo/c66x/demo_loopback/src/demo_loopback.c中定义。
这个函数比较复杂,从函数的注释上来看,该函数的逻辑过程是:打开mailbox,接收message,将接收到的message拷贝到outputbuffer,打印结果,现在开始仔细分析:
1、这个函数主要围绕两个数据结构进行:
mpm_mailbox_config_t 和 mpm_mailbox_inst_t进行。这两个数据结构,前者是mailbox的配置,start_addr、size、payload_size。后者就是所谓的"mailbox"了。这个函数简单来说干了一件事情就是:填满这两个数据结构(当然最终目的是后者,config_t只是一个过渡也是inst_t的一个子集)。
2、对于上述mpm_maibox_inst_t这个数据结构,该函数采用两个指针来进行操作rxMailBoxHandle和txMailBoxHandle,分别是收发操作的指针,也代表由Host->DSP 和 DSP->Host这两个方向。
3、一项项看mailbox需要初始化的内容:
1.mem_start_addr:使用二维数组(host2dspmailbox 和 dsp2hostmailbox)初始化,以host2dspmailbox为例,本质上是一个8*4k的二维数组(8个dsp,每个dsp使用的mailbox大小为4k),这样求每个dsp的其实地址实质上就是二维数组的locate。
2.mem_size:4K (0x1000)程序中写死。
3.mem_payload_size:116 程序中写死。
以上3点正是mpm_mailbox_config_t中的内容。
4.接下来的事情就有趣了demo_loopback_test_assert();作用应该类似assert()做了一层封装,内部实现暂时不管,assert的内容是一个函数mpm_mailbox_create();下面进入这个函数进行分析。
1.内部用inst指针(mpm_mailbox_inst_t*)指向mpm_mailbox_handle(void *),因此,问题又变成对inst指针中成员的赋值,然后用指针返回内容。
2.赋值:里面一些成员的具体定义不是很清楚,比如slot_size、depth等,这些变量有其固定的算法,求出来后将值放入指针。然后将mpm_mailbox_config_t中的值填入inst指针。
3.后面的内容主要是求slot_owner,这又涉及到几个数据结构:mpm_mailbox_slot_header_t、mpm_mailbox_header_t。(问题)
5.根据代码注释:程序对tx和rx的handle做了类似的初始化后,接下来对rx和tx的handle进行打开操作mailbox(mpm_mailbox_open函数)。(内部实现问题)
4、初始化过后就是具体算法操作(for(;;)循环里的代码块实现):
1.首先是mpm_mailbox_query(rxMailBoxHandle);函数。进入函数内部,通过read和write
的索引计算mailbox中message的个数(此处计算方法类似于循 环队列的front和rear) 。
2.mpm_mailbox_read与mpm_mailbox_write 这两个函数内部实现复杂,基本功能就是往
mailbox里面写跟读,查看内部代码可以通过修改transport成员 的值来改变底层的通信方式
(shared_memory或者hyperlink)