前言
上一期我们讲述了MSS的main函数的源码,这一期我来解读一下MSS和DSS信息交流的代码
一、代码位置及Semaphore文档位置
打开mss_main.c的文件,搜索Semaphore,大概位置如下: 这里发现Semaphore在mmWave SDK Module Documentation无法找到相关定义,于是我打算找到这个的头文件 我这里的方法是直接在电脑里用everything软件搜索Semaphore.h,找到类似的地址 这里能发现这个地址和头文件引用的地址十分相像,所以接下来我们大概率可以在这个地方附件找到相关文档。 接下来,我们就在目录中往上寻找,找到docs,点击进去,能发现一个官方文档 地址为:mmwave_sdk_3.2所在地址\bios_6_73_01_01\docs\Bios_APIs.html
点击进入,进行一定的索引,就能找到Semaphore相关文档。 成功找到。 接下来要用到的mailbox文档就在mmWave SDK Module Documentation中
二、代码解释
1.创建一个二进制Semaphore来处理信箱中断
Semaphore_Params_init(&semParams);
semParams.mode = Semaphore_Mode_BINARY;
gMrrMSSMCB.mboxSemHandle = Semaphore_create(0, &semParams, NULL);
Semaphore_Params_init
函数介绍索引如下: 代码介绍:
Void Semaphore_Params_init(Semaphore_Params *params);
Semaphore_Mode_BINARY
功能:These enumerations specify the type of semaphore.,指定信号量的类型为二进制
Semaphore_create(0, &semParams, NULL)
参数含义:
count:初始化信号量的计数值
params:每个实例配置参数,当为NULL时选择默认值
eb:错误处理块,当NULL时选择默认策略
所以这里设定初始化时的计数值为0,错误处理块为默认值。
2.Mailbox
Mailbox_Config_init(&mboxCfg);
mboxCfg.chType = MAILBOX_CHTYPE_MULTI;
mboxCfg.chId = MAILBOX_CH_ID_0;
mboxCfg.writeMode = MAILBOX_MODE_BLOCKING;
mboxCfg.readMode = MAILBOX_MODE_CALLBACK;
mboxCfg.readCallback = &MmwDemo_mboxCallback;
Mailbox初始化
功能:函数将Mailbox_Config结构初始化为其默认值。
初始化Mailbox虚拟通道
gMrrMSSMCB.peerMailbox = Mailbox_open(MAILBOX_TYPE_DSS, &mboxCfg, &errCode);
if (gMrrMSSMCB.peerMailbox == NULL)
{
System_printf("Error: Unable to open the Mailbox to the DSS [Error code %d]\n", errCode);
return;
}
找文档流程与上文类似,接下来不再赘述。主要进行代码功能的解释。 功能:函数初始化邮箱驱动程序的实例。
注意:在MSS<->BSS之间,只能打开驱动程序的一个实例。 如果Mailbox为空,则会进行初始化失败的报错。
创建任务进行Mailbox信息处理
Task_Params_init(&taskParams);
taskParams.stackSize = 16*1024;
Task_create(MmwDemo_mboxReadTask, &taskParams, NULL);
该文档与一开始的Semaphore位于同一区域,都属于头文件调用,具体文档这里不再贴出来了。 功能:读取Mailbox里的数据
注册侦听器
memset ((void*)&listenerCfg, 0, sizeof(SOC_SysIntListenerCfg));
listenerCfg.systemInterrupt = SOC_XWR18XX_MSS_CHIRP_AVAIL_IRQ;
listenerCfg.listenerFxn = MRR_MSS_chirpIntCallback;
listenerCfg.arg = 0;
gMrrMSSMCB.chirpIntHandle = SOC_registerSysIntListener (gMrrMSSMCB.socHandle, &listenerCfg, &errCode);
if (gMrrMSSMCB.chirpIntHandle == NULL)
{
System_printf ("Error: Unable to register the Chirp Available Listener [Error code %d]\n", errCode);
return;
}
memset ((void*)&listenerCfg, 0, sizeof(SOC_SysIntListenerCfg));
listenerCfg.systemInterrupt = SOC_XWR18XX_MSS_FRAME_START_INT;
listenerCfg.listenerFxn = MRR_MSS_frameStartIntCallback;
listenerCfg.arg = 0;
gMrrMSSMCB.frameStartIntHandle = SOC_registerSysIntListener (gMrrMSSMCB.socHandle, &listenerCfg, &errCode);
if (gMrrMSSMCB.frameStartIntHandle == NULL)
{
System_printf("Error: Unable to register the Frame start Listener [Error code %d]\n", errCode);
return ;
}
主要函数SOC_registerSysIntListener 相关文档位于
功能:该函数用于注册系统中断的侦听器。可以将多个侦听器连接到一个系统中断,一旦触发中断,SOC模块将确保调用已注册的侦听器。 返回值:
Success - Handle to the System Interrupt Listener
Error - NULL
要是返回值为NULL,则报错。 listenerCfg的结构体定义文档 里面可以看到结构体变量的定义。
总结
这次主要的问题是找不到Semaphore文档的位置,所以毫无头绪,只能靠代码来猜测含义,不过这也体现了Ti定义的完善性,许多代码哪怕不看文档也能猜测出大概的含义。不过要是需要深究代码的功能,则需要详细的文档。 寻找文档的方法: 首先先去mmWave SDK Module Documentation文档中寻找,一般的驱动程序文档在里面都找的到,如果找不到,则通过Ctrl+F找到头文件,然后通过头文件的位置,往上级目录里找,找到类似于docs的文件夹,大概率文档就在这个文件夹里面。 不得不说,Ti公司的文档写的十分详细,在索引的时候一级接着一级,环环相扣,逻辑清晰。 接下来的更新还是看时间,最近有亿点忙。。。
|