📄 os_mailbox.c
字号:
/*
*******************************************************************************
*
* MicroROS
*
* Copyright (C) 2007 <amwox@163.com>
*
* Description : 互斥型信号量
*
* File : os_mailbox.c
* Author : amwox
* Edition : V0.10
* History : 2007-11-18 created
* 2008-01-28 增加事件列表指针,并对处理方式作了相应的变化
*******************************************************************************
*/
#include "..\include\MicroROS.h"
#include "..\include\os_cpu.h"
#if MAILBOX_EN > 0
/*
* Description :
* Arguments :
* Returns :
*/
void OS_MailBoxCreate(pMAILBOX pMailBox)
{
#if EVENT_BLOCK_COUNT > 0
pMailBox->BlockCnt = 0;
#endif
pMailBox->pMail = NULL;
pMailBox->pMailList = NULL;
}
/*
* Description :
* Arguments :
* Returns :
*/
BYTE OS_MailBoxPend(pMAILBOX pMailBox, void ** pMail, WORD timeout)
{
CPU_SREG cpu_sreg;
OS_ENTER_CRITICAL();
if (pMailBox->pMail != NULL) {
pMail = pMailBox->pMail;
OS_EXIT_CRITICAL();
return NO_ERROR;
}
BYTE err = NO_RESOURCE;
pPID pPid;
pPid = os_kernel.pRunning;
_AppendEvent(&pMailBox->pMailList,pPid);
pPid->TimerCnt = timeout;
pPid->State |= BV(PID_MAILBOX); /*等待状态*/
#if EVENT_BLOCK_COUNT > 0
pMailBox->BlockCnt ++;
#endif
err = TIME_OUT;
while (pPid->TimerCnt) {
OS_TaskSuspend(pPid);
if (pPid->TimerCnt != LIMITLESS) {
_QueueTimer(pPid);
}
OS_EXIT_CRITICAL();
_Schedule();
OS_ENTER_CRITICAL();
if (pMailBox->pMail != NULL) {
*pMail = pMailBox->pMail; /*拿走所需的资源*/
pMailBox->pMail = NULL;
err = NO_ERROR;
break;
}
}
#if EVENT_BLOCK_COUNT > 0
pMailBox->BlockCnt --;
#endif
_RemoveEvent(&pMailBox->pMailList,pPid);
pPid->State &= ~BV(PID_MAILBOX);
OS_EXIT_CRITICAL();
return err;
}
/*
* Description :
* Arguments :
* Returns :
*/
void OS_MailBoxPost(pMAILBOX pMailBox, void * pMail)
{
CPU_SREG cpu_sreg;
OS_ENTER_CRITICAL();
pMailBox->pMail = pMail;
OS_EXIT_CRITICAL();
if (pMailBox->pMailList == NULL)
return;
_WakeupEvent(pMailBox->pMailList);
_Schedule();
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -