📄 multi_mailbox.c
字号:
/**********************************************************
*Function discription: Task在多个邮箱上的挂起
*
*interface function
*MM_Create 创建一个多邮箱对象
*MM_Send 发送消息至多邮箱交换
*MM_Receive 从一个挂起的邮箱接收消息
*
**********************************************************/
#include <nucleus.h>
/*这是多邮箱挂起服务控制结构*/
typedef struct MMAIL_STRUCT
{
NU_SEMAPHORE message_count;
NU_MAILBOX mailbox_1;
NU_MAILBOX mailbox_2;
NU_MAILBOX mailbox_3;
}MMAIL;
/*定义多邮箱服务接口*/
STATUS MM_Create(MMAIL *mmail_control);
STATUS MM_Send(MMAIL *mmail_control,INT mailbox_id, VOID *message,UNSIGNED suspend);
STATUS MM_Receive(MMAIL *mmail_control, VOID *message,UNSIGNED suspend);
/*下面是一个多任务挂起服务的C 源程序例子*/
/**********************************************************
*Function: 创建一个多任务控制块
**********************************************************/
STATUS MM_Create(MMAIL *mmail_control)
{
/*创建单片控制块*/
NU_Create_Semaphore(&(mmail_control ->message_count), "MMCOUNT",0,NU_FIFO);
NU_Create_Mailbox(&(mmail_control ->mailbox_0), "MM_MB_0",NU_FIFO);
NU_Create_Mailbox(&(mmail_control ->mailbox_1), "MM_MB_1",NU_FIFO);
NU_Create_Mailbox(&(mmail_control ->mailbox_2), "MM_MB_2",NU_FIFO);
/*返回一个成功状态,虽然状态应该从每个先前调用被检测。*/
return(NU_SUCCESS);
}
/**********************************************************
*Function: 发送一个消息到多邮箱对象
**********************************************************/
STATUS MM_Send(MMAIL *mmail_control, INT Mailbox_id, VOID *message, UNSIGNED suspend)
{
STATUS status;
/*决定哪个邮箱发送请求*/
if (mailbox_id == 0){
/*发送消息至邮箱0*/
status = NU_Send_To_Mailbox(&(mmail_control ->mailbox_0), message,suspend);
}
else if (mailbox_id == 1){
/*发送消息到邮箱1*/
status = NU_Send_To_Mailbox(&(mmail_control ->mailbox_1), message,suspend);
}
else{
/*发送消息至邮箱2*/
status = NU_Send_To_Mailbox(&(mmail_control ->mailbox_2), message,suspend);
}
/*确定是否消息发送成功*/
if (status == NU_SUCCESS){
/*递增计数信号量*/
NU_Release_Semaphore(&(mmail_control -> message_count));
}
/*返回状态至调用*/
return(status);
}
/**********************************************************
*Function:从多邮箱中一个接收消息
**********************************************************/
STATUS MM_Receive(MMail *mmail_control,VOID *message,unsigned suspend)
{
STATUS status;
/*获得消息信号量*/
status = NU_Obtain_Semaphore(&(mmail_control->message_count),suspend);
/*确定消息是否出现*/
if (status = NU_SUCCESS)
{
/*寻找第一个有效消息,从邮箱0 开始*/
status = NU_Receive_From_Mailbox(&(mmail_control ->mailbox_0),
message,NU_NO_SUSPEND);
/*确定下一个邮箱是否需要被查询*/
if (status != NU_SUCCESS){
/*检查邮箱1*/
status = NU_Receive_From_Mailbox(&(mmail_control->mailbox_1),
message,NU_NO_SUSPEND);
}
else{
/*消息必须在邮箱2 中*/
status = NU_Receive_From_Mailbox(&(mmail_control->mailbox_2),
message,NU_NO_SUSPEND);
}
/*返回一个完整的状态到调用*/
return(status);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -