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

📄 os_mailbox.c

📁 一个简单易用的可裁减的小型实时操作系统 移植非常简单
💻 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 + -