Nucleus源码分析Mailbox.docx
《Nucleus源码分析Mailbox.docx》由会员分享,可在线阅读,更多相关《Nucleus源码分析Mailbox.docx(19页珍藏版)》请在冰豆网上搜索。
Nucleus源码分析Mailbox
Nucleus源码分析--Mailbox模块
大唐微电子技术有限公司
邵壮
页数
修改后版本
修改者
修改日期
修改说明
备注
Documentinformation
FileLocation
D:
\××××\×××××××.doc(请说明在文档服务器上的位置)
Lastsaved
2005-1-414:
35
目录
1.概述3
1.1功能描述3
1.2文件信息3
2.实现原理4
2.1邮箱结构4
2.2邮箱管理4
2.3邮箱挂起管理4
3.数据结构5
3.1MB_MCB邮箱控制块5
3.2MB_SUSPEND邮箱挂起控制块5
3.3模块变量(全局)5
4.程序分析6
4.1接口函数映射表6
4.2MBC.C程序6
4.2.1MBC_Create_Mailbox6
4.2.2MBC_Delete_Mailbox7
4.2.3MBC_Send_To_Mailbox8
4.2.4MBC_Receive_From_Mailbox10
4.2.5MBC_Cleanup12
4.3MBS.C程序13
4.3.1MBS_Reset_Mailbox13
4.3.2MBS_Broadcast_To_Mailbox14
4.4其它16
4.4.1MBD.C16
4.4.2MBI.C16
4.4.3MBF.C17
4.4.4MBCE.C17
4.4.5MBSE.C17
1.
概述
1.1功能描述
邮箱是一种低负荷传递消息的机制。
每个邮箱可容纳一条4*32位字的消息。
通过值的收发来完成消息的传递。
发送消息的请求拷贝消息值到邮箱,接受消息请求又从邮箱中将消息取出来。
收发邮件的服务有几种挂起选择:
无条件被挂起、超时挂起和不挂起。
任务因为邮箱挂起可能有几种原因。
如果任务试图从一个空的邮箱里接收邮件,它将被挂起等待。
如果一个任务试图向一个非空邮箱发送邮件也可能被挂起。
当邮箱完成了任务的请求后,被挂起的任务就将被恢复。
例如,假设一个任务因为等待从邮箱接收消息而被挂起。
当消息发到了邮箱,任务就会恢复。
多个任务会因某个邮箱而被挂起。
对挂起的任务的调度方法可以采用FIFO或者优先权,这根据邮箱建立时设置而定。
如果邮箱支持FIFO挂起,任务恢复的顺序与他们挂起的顺序一致。
如果邮箱支持优先级挂起,任务的恢复按照告优先级到低优先级的顺序。
1.2文件信息
邮箱组件(MB)包括9个文件,列表如下:
文件名称
内容描述
MB_DEFS.H
该文件定义MB组件特定的数据结构和常量
MB_EXTR.H
该文件定义MB组件的外部接口
MBD.C
该文件定义MB组件的全局数据结构
MBI.C
该文件包括MB组件的初始化代码
MBF.C
该文件包括提供MB组件信息的相关函数
MBC.C
该文件包括MB组件的核心函数
MBS.C
该文件包括MB组件的附加函数
MBCE.C
该文件包括有错误检查的定义在MBC.C中的函数
MBSE.C
该文件包括有错误检查的定义在MBS.C中的函数
2.实现原理
2.1邮箱结构
每一邮箱空间为4*32b,仅放一条消息。
2.2邮箱管理
应用程序在创建邮箱前应建立一个NU_MAILBOX类型的控制块,空间由应用程序提供。
所有已创建邮箱的控制块都将被加入由MBD_Created_Mailboxs_List所指向的双向链表中,删除邮箱则将其从此双向链表中删除。
结构如下图所示:
模块变量MBD_List_Protect用于保护对于此链表的多重访问。
2.3邮箱挂起管理
当任务接收或发送消息至邮箱时,在任务栈内会形成一个局部邮箱挂起控制块,若因此次调用而挂起,则将该控制块加入此邮箱的挂起链表。
结构如下:
当需从挂起恢复时,遍历此链表即可。
3.数据结构
3.1MB_MCB邮箱控制块
typedefstructMB_MCB_STRUCT
{
CS_NODEmb_created;/*已创建邮箱双向链表结点*/
UNSIGNEDmb_id;/*内部MCBID*/
CHARmb_name[NU_MAX_NAME];/*邮箱名称*/
DATA_ELEMENTmb_message_present;/*当前消息标志*/
DATA_ELEMENTmb_fifo_suspend;/*挂起类型标志*/
#ifPAD_2
DATA_ELEMENTmb_padding[PAD_2];
#endif
UNSIGNEDmb_tasks_waiting;/*等待的任务数*/
UNSIGNED/*邮箱空间*/
mb_message_area[MB_MESSAGE_SIZE];
structMB_SUSPEND_STRUCT
*mb_suspension_list;/*挂起列表*/
}MB_MCB;
3.2MB_SUSPEND邮箱挂起控制块
typedefstructMB_SUSPEND_STRUCT
{
CS_NODEmb_suspend_link;/*挂起列表结点*/
MB_MCB*mb_mailbox;/*邮箱指针*/
TC_TCB*mb_suspended_task;/*挂起任务指针*/
UNSIGNED*mb_message_area;/*邮箱空间指针*/
STATUSmb_return_status;/*返回的状态*/
}MB_SUSPEND;
3.3模块变量(全局)
CS_NODE*MBD_Created_Mailboxes_List;//已创建邮箱链表头指针
UNSIGNEDMBD_Total_Mailboxes;//已创建邮箱数量
TC_PROTECTMBD_List_Protect;//防止已创建邮箱链表被多重访问
4.程序分析
4.1接口函数映射表
API函数
对应的内部函数
(NoErrorCheck)
对应的内部函数
(ErrorCheck)
NU_Create_Mailbox
MBC_Create_Mailbox
MBCE_Create_Mailbox
NU_Delete_Mailbox
MBC_Delete_Mailbox
MBCE_Delete_Mailbox
NU_Reset_Mailbox
MBS_Reset_Mailbox
MBSE_Reset_Mailbox
NU_Send_To_Mailbox
MBC_Send_To_Mailbox
MBCE_Send_To_Mailbox
NU_Broadcast_To_Mailbox
MBS_Broadcast_To_Mailbox
MBSE_Broadcast_To_Mailbox
NU_Receive_From_Mailbox
MBC_Receive_From_Mailbox
MBCE_Receive_From_Mailbox
NU_Established_Mailboxs
MBF_Established_Mailboxs
MBF_Established_Mailboxs
NU_Mailbox_Information
MBF_Mailbox_Information
MBF_Mailbox_Information
NU_Mailbox_Pointers
MBF_Mailbox_Pointers
MBF_Mailbox_Pointers
4.2MBC.C程序
4.2.1MBC_Create_Mailbox
函数原型:
STATUSMBC_Create_Mailbox(NU_MAILBOX*mailbox_ptr,CHAR*name,
OPTIONsuspend_type)
功能描述:
创建邮箱
扇入函数:
Application
MBCE_Create_Mailbox
扇出函数:
CSC_Place_On_List
[HIC_Make_History_Entry]
[TCT_Check_Stack]
TCT_Protect
TCT_Unprotect
输入参数:
mailbox_ptr邮箱控制块指针
name邮箱名字7个字符,以空字符结束
suspend_type挂起类型
返回值:
NU_SUCCESS成功完成函数调用
实现流程:
4.2.2MBC_Delete_Mailbox
函数原型:
STATUSMBC_Delete_Mailbox(NU_MAILBOX*mailbox_ptr)
功能描述:
删除邮箱并从已创建链表中移出
扇入函数:
Application
MBCE_Delete_Mailbox
扇出函数:
CSC_Remove_From_List
[HIC_Make_History_Entry]
[TCT_Check_Stack]
TCT_Protect
TCT_System_Protect
TCT_Unprotect
TCC_Resume_Task
TCT_Control_To_System
TCT_Set_Current_Protect
TCT_System_Unprotect
输入参数:
mailbox_ptrMailbox控制块指针
返回值:
NU_SUCCESS成功完成函数调用
4.2.3MBC_Send_To_Mailbox
函数原型:
STATUSMBC_Send_To_Mailbox(NU_MAILBOX*mailbox_ptr,VOID*message,
UNSIGNEDsuspend)
功能描述:
发送消息至邮箱
扇入函数:
Application
MBCE_Send_To_Mailbox
扇出函数:
CSC_Remove_From_List
[HIC_Make_History_Entry]
[TCT_Check_Stack]
TCT_System_Protect
TCT_Unprotect
TCC_Resume_Task
TCT_Control_To_System
TCT_System_Unprotect
CSC_Place_On_List
CSC_Priority_Place_On_List
TCC_Suspend_Task
TCC_Task_Priority
TCT_Current_Thread
输入参数:
mailbox_ptr邮箱控制块指针
message发送的消息
suspend_type挂起类型
返回值:
NU_SUCCESS表明service执行成功
NU_MAILBOX_FULL表明邮箱为满
NU_TIMEOUT超时
NU_MAILBOX_DELETED当任务被挂起时,邮箱被删除
NU_MAILBOX_RESET当任务被挂起时,邮箱被复位
实现流程:
4.2.4MBC_Receive_From_Mailbox
函数原型:
STATUSMBC_Receive_From_Mailbox(NU_MAILBOX*mailbox_ptr,
VOID*message,UNSIGNEDsuspend)
功能描述:
从邮箱接收消息
扇入函数:
Application
MBCE_Receive_From_Mailbox
扇出函数:
CSC_Remove_From_List
[HIC_Make_History_Entry]
[TCT_Check_Stack]
TCT_System_Protect
TCT_Unprotect
TCC_Resume_Task
TCT_Control_To_System
CSC_Place_On_List
CSC_Priority_Place_On_List
TCC_Suspend_Task
TCC_Task_Priority
TCT_Current_Thread
输入参数:
mailbox_ptr邮箱控制块指针
message接收消息指针
suspend_type挂起类型
返回值:
NU_SUCCESS表明service执行成功
NU_MAILBOX_EMPTY表明邮箱为空
NU_TIMEOUT超时
NU_MAILBOX_DELETED当任务被挂起时,邮箱被删除
NU_MAILBOX_RESET当任务被挂起时,邮箱被复位
实现流程:
4.2.5MBC_Cleanup
函数原型:
VOIDMBC_Cleanup(VOID*information)
功能描述:
移除挂起控制块
扇入函数:
TCC_Timeout
TCC_Terminate
扇出函数:
CSC_Remove_From_List
输入参数:
information挂起控制块指针
返回值:
无
实现流程:
将挂起控制块的返回状态置为NU_TIMEOUT后,将其从挂起链表中删除。
4.3MBS.C程序
4.3.1MBS_Reset_Mailbox
函数原型:
STATUSMBS_Reset_Mailbox(NU_MAILBOX*mailbox_ptr)
功能描述:
复位邮箱
扇入函数:
Application
MBSE_Reset_Mailbox
扇出函数:
TCC_Resume_Task
[HIC_Make_History_Entry]
[TCT_Check_Stack]
TCT_System_Protect
TCT_Unprotect
TCT_Control_To_System
输入参数:
mailbox_ptrMailbox控制块指针
返回值:
NU_SUCCESS成功完成函数调用
实现流程:
4.3.2MBS_Broadcast_To_Mailbox
函数原型:
STATUSMBS_Broadcast_To_Mailbox(NU_MAILBOX*mailbox_ptr,VOID*message,
UNSIGNEDsuspend)
功能描述:
发送广播消息至邮箱
扇入函数:
Application
MBSE_Broadcast_To_Mailbox
扇出函数:
CSC_Remove_From_List
CSC_Place_On_List
CSC_Priority_Place_On_List
[HIC_Make_History_Entry]
[TCT_Check_Stack]
TCT_System_Protect
TCT_Unprotect
TCC_Resume_Task
TCC_Suspend_Task
TCC_Task_Priority
TCT_Control_To_System
TCT_Current_Thread
输入参数:
mailbox_ptr邮箱控制块指针
message发送的消息
suspend_type挂起类型
返回值:
NU_SUCCESS表明service执行成功
NU_MAILBOX_FULL表明邮箱为满
NU_TIMEOUT超时
NU_MAILBOX_DELETED当任务被挂起时,邮箱被删除
NU_MAILBOX_RESET当任务被挂起时,邮箱被复位
实现流程:
4.4其它
4.4.1MBD.C
模块全局变量定义。
4.4.2MBI.C
模块初始化函数
VOIDMBI_Initialize(VOID)
函数功能:
初始化模块全局变量。
4.4.3MBF.C
获取模块信息函数
UNSIGNEDMBF_Established_Mailboxs(VOID);
函数功能:
得到已建立Mailbox的数量
STATUSMBF_Mailbox_Information(NU_MAILBOX*Mailbox_ptr,CHAR*name,
OPTION*enable,UNSIGNED*expirations,UNSIGNED*id,
UNSIGNED*initial_time,UNSIGNED*reschedule_time);
函数功能:
得到指定Mailbox的相关信息
UNSIGNEDMBF_Mailbox_Pointers(NU_MAILBOX**pointer_list,
UNSIGNEDmaximum_pointers);
函数功能:
建立一个系统中所有EstablishedMailboxs的指针列表
4.4.4MBCE.C
带参数有效性检验的MBS.C相关函数接口
STATUSMBCE_Create_Mailbox(NU_MAILBOX*mailbox_ptr,CHAR*name,
OPTIONsuspend_type)
函数功能:
若输入参数有效则调用MBC_Create_Mailbox
STATUSMBCE_Delete_Mailbox(NU_MAILBOX*mailbox_ptr)
函数功能:
若输入参数有效则调用MBC_Delete_Mailbox
STATUSMBCE_Send_To_Mailbox(NU_MAILBOX*mailbox_ptr,VOID*message,
UNSIGNEDsuspend)
函数功能:
若输入参数有效则调用MBC_Send_To_Mailbox
STATUSMBCE_Receive_From_Mailbox(NU_MAILBOX*mailbox_ptr,VOID*message,
UNSIGNEDsuspend)
函数功能:
若输入参数有效则调用MBC_Receive_From_Mailbox
4.4.5MBSE.C
带参数有效性检验的MBS.C相关函数接口
STATUSMBSE_Reset_Mailbox(NU_MAILBOX*Mailbox_ptr,
VOID(*expiration_routine)(UNSIGNED),
UNSIGNEDinitial_time,UNSIGNEDreschedule_time,
OPTIONenable);
函数功能:
若输入参数有效则调用MBS_Reset_Mailbox
STATUSMBSE_Broadcast_To_Mailbox(NU_MAILBOX*mailbox_ptr,
VOID*message,UNSIGNEDsuspend)
函数功能:
若输入参数有效则调用MBS_Broadcast_To_Mailbox