⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 multi_mailbox.c

📁 此代码为NUCLEUS操作系统的原码
💻 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 + -