八 MSS代码解读-MmwDemo_mboxReadTask线程( 二 )


邮箱消息清除完成后,接下来就是通过 语句对进行后续处理,通过判断.type(消息类型)选择需要执行的代码块,当这个消息类型为(DSS到MSS的消息,数据处理完成消息)时,表明.body中存储的是数据路径处理完成的数据,开始执行对应的操作 。值得注意的是,在这里,它将执行如下的代码片段完成.body中消息的传输;
在上面的代码中,首先声明三个局部参数,依次为、、;
用于记录数据包的总长度
用于记录数据报后需要填充的bite数
由于循坏的参数
局部参数声明完成后,接下来就是对消息通过UART串口发送到上位机,消息头和消息体依次发送;
发送消息头:
= ();//表示先计算消息头的长度,后续每发送一个Tlv报文,这个数据包长度就增加一个tlv长度
发送消息体:
消息体需要通过一个for循坏来多次发送,主要是因为一个数据包中,包含多个TLV报文
将消息头和消息体都发送完成后,由于每个数据包总是32字节的倍数,所以需要检查这个数据包是否满足这个条件,如果不满足则需要在数据包后进行填充0,使其满足这个条件为止,如下代码片段所示;
到此就完整的将一个数据包发送到上位机,即参数()中的信息已经成功通过数据包发送给上位机,接下来就是MSS向邮箱存放消息告知DSS已经将你存放的消息处理完成了,值得注意的是,MSS在进行相关的邮箱写入操作时,需要将参数()初始化为了0 。如下所示,在这里MSS通过外部函数完成邮箱写入过程;
函数:
到这里为止,当.type=类型的情况已经讲解完 。当.type=(DSS到MSS的断言信息),代码块如下;
这表明,当参数()消息头等于这个时候,说明DSS发生了某些错误,需要中断程序,即调用断言函数,并且将错误信息显示在CLI命令行窗口,这是通过 API完成的 。
在这个开关函数中除了上述描述的两种类型的消息头有定义外,其余的都无定义,在控制台显示错误信息,如下所示 。
函数原型:
1)
描述
函数,从邮箱读取数据 。邮箱一次只能从远程端点读取一条消息 。可以对邮箱中的同一消息执行多个()调用 。例如,应用程序可以读取消息的一部分来计算整个消息的长度,并发出后续的() 。邮箱驱动程序在内部跟踪为消息读取的字节数 。消息的第一个()总是从字节0开始 。对于同一消息调用多个()的情况,后续读取将从前一次读取停止的位置的下一个字节开始 。一旦应用程序完成读取消息,它必须发出()来释放邮箱缓冲区并通知远程端点 。邮箱缓冲区的最大大小由SIZE( () 2044U)给出 。如果邮件的大小大于邮箱缓冲区,则应用程序代码负责对邮件进行分段处理 。所有与读取操作相关的中断都由驱动程序管理,不向应用程序公开 。返回已读取或错误的字节数 。
参数
邮箱控制句柄
指向空缓冲区的指针,接收到的数据应写入其中 。
size 要写入缓冲区的字节数
返回值
返回已从邮箱中读取的字节数 。如果发生错误,则返回邮箱错误码之一 。
2)
描述
应在应用程序完成读取消息后调用的函数 。通知远程端点,在读取上一条消息之后,本地邮箱已准备好接收新消息 。在本地端点发出()之前,远程端点不能向本地端点发送新消息 。一旦发出(),本地端点必须假定先前接收到的消息不再位于邮箱缓冲区中,并且后续的()将不返回任何数据,直到新消息到达邮箱 。
参数
邮箱控制句柄
返回值
在失败时返回错误代码 。
3)
描述
这个函数启动一个向UART控制器写入数据的操作,将数据写入UART 。