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

📄 mailbox.c

📁 minitos是一个实时的嵌入式操作系统
💻 C
字号:
/*
	miniTOS V0.1.3  1998-2004 (c) 林良水 (Lin LS)
	miniTOS是一个开放源码的软件,授权LGPL,但开发人员不保证本软件的可靠性,
以及对您的损失负任何责任。
	www.minitos.com

	本文实现miniTOS MailBox IPC通讯。

	create by Lin LS ,1998.10
	modified by Lin LS ,2000.8
	modified by LinLS,2003
	
	Bug report: mail to (林良水) testmyself@163.net
*/

#include <stdio.h>

#include "minitosdef.h"
#include "extdefine.h"

//建立一邮箱供进程间通讯使用。
MAILBOX	* CreatMailBox(MAILBOX	* ptrMailBox,void * MailBoxBuf)
{
	ptrMailBox->ptrSrc=NULL;
	ptrMailBox->ptrDest=NULL;
	ptrMailBox->ptrMailBoxBuf=MailBoxBuf;
	return ptrMailBox;
}

//发送msg到ptrMailBox邮箱,并指定接收者为dest.
int SendMailBox(struct ProcTbl * dest, MAILBOX	* ptrMailBox,void *Msg)
{
	if(dest==NULL)
		return ERR_DEST;
	//MailBox empty?
	if(ptrMailBox->ptrDest!=NULL)	//==NULL为空邮箱
	{//邮箱满
		return ERR_MAILBOXFULL;
	}
	ptrMailBox->ptrDest=dest;
	ptrMailBox->ptrSrc=ptrCurrProc;
	ptrMailBox->ptrMailBoxBuf=Msg;
	if ( (dest->status)==2)	//Is dest Block for waiting Mailbox? 
	{				//yes; unBlock it
		ready(dest);
		sched();	
		return 0;		
	}else
	{  //Dest没有阻塞在MailBox,直接返回
		return 0;
	}
	
}
//从ptrMailBox邮箱中取消息。若无消息则挂起等待。
int ReceiveMailBoxSuspend(MAILBOX * ptrMailBox,void *Msg)
{
	if(ptrMailBox->ptrDest!=NULL)	// !=NULL表示已经有消息了
	{
		if(ptrMailBox->ptrDest==ptrCurrProc)
		{  //目的是给本进程
			Msg=ptrMailBox->ptrMailBoxBuf;	//取出邮箱的内容
			ptrMailBox->ptrSrc=NULL;
			ptrMailBox->ptrDest=NULL;
			return 0;
		}else
		return (-1);
	}	
	ptrCurrProc->status=0x02;  //set status bit mean blocking for waiting mailbox	
	unready(ptrCurrProc);
	sched();	
	ptrCurrProc->status=0;	//bit.1 clear to 0			
	if(ptrMailBox->ptrDest==ptrCurrProc)
	{
		Msg=ptrMailBox->ptrMailBoxBuf;
		ptrMailBox->ptrSrc=NULL;
		ptrMailBox->ptrDest=NULL;
		return 0;
	}else
	return (-1);	
}

/*
使用说明

char MsgBuf[100];
MAILBOX		m1;
MAILBOX	* ptrM1;
void idle1(void)
{
	ptrM1=CreatMailBox(&m1,MsgBuf);
	for(;;)
	{
		SendOneChar(1,'1');
		ReceiveMailBoxSuspend(ptrM1,MsgBuf);
	}
}

void idle2(void)
{
	int i;
	for(;;)

	{
		SendOneChar(1,i);
		i=SendMailBox(&Proc[0],ptrM1,MsgBuf);
		i=i+'0';
	}
}

*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -