📄 mailbox.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 + -