?? 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 + -