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

📄 tport.c

📁 samsung 9908DVD源代码,
💻 C
字号:
/**********************************************************************************
 * tport.c
 * coded by hspark@ce.cnu.ac.kr
 * date : 2001/06/23
 * modified by hjahn@ce.cnu.ac.kr
 * date : 2003/03/03
 **********************************************************************************/

#include "kernel\\mk_sys.h"
#include "kernel\\mk_task.h"
#include "kernel\\mk_tport.h"
#include "util\\mk_lib.h"

#ifdef _MK_TPORT

MK_PENDING_LIST	MK_TaskPortPendingList;

STATUS
MK_TaskPortInitialize(VOID)
{
	return MK_CreatePendingList(&MK_TaskPortPendingList, MK_SERVICE_FIFO);
}

STATUS 
MK_TaskPortSend(MK_TASK *pTask, ULONG Value, BOOLEAN Ignore)
{
	INT Flags;

	Flags = MK_InterruptDisable();		/* Critical Region */

	if(Ignore == MK_UPDATE_NORMAL && pTask->t_PortValueAvailable == TRUE)
	{
#if MK_DEBUG_PRINT
		MK_InfoPrintf(MK_TASK_WARNING, "MK_TaskPortSend() - Does't trance TaskPort value! Task(%s)\n", MK_GetCurrentTask()->t_pName);
#endif
		MK_InterruptRestore(Flags);
		return MK_ERROR;
	}

	pTask->t_PortValueAvailable = TRUE;
	pTask->t_PortValue = Value;

	if(pTask->t_PortPending)
	{
		MK_DeleteTaskFromPendingList(&MK_TaskPortPendingList, pTask);
		if(pTask->t_Status & MK_TASK_DELAYED)
		{
			MK_DeleteTaskFromDelayedList(pTask);
		}
		MK_InsertTaskToReadyList(pTask);
		MK_Schedule();
	}

	MK_InterruptRestore(Flags);
	return MK_NO_ERROR;
}

STATUS 
MK_TaskPortReceive(ULONG *Value, LONG Ticks)
{
	MK_TASK *pTask;
	INT Flags;

	Flags = MK_InterruptDisable();		/* Critical Region */

	pTask = MK_GetCurrentTask();
	if(pTask->t_PortValueAvailable)
	{
		*Value = pTask->t_PortValue;
		pTask->t_PortValueAvailable = FALSE;
		pTask->t_PortPending = FALSE;
	}
	else
	{
		if(Ticks == MK_NO_WAIT)
		{
#if MK_DEBUG_PRINT
			MK_InfoPrintf(MK_TASK_WARNING, "MK_TaskPortReceive() - Timeout! Task(%s)\n", MK_GetCurrentTask()->t_pName);
#endif
			MK_InterruptRestore(Flags);
			return MK_TIMEOUT;
		}

		MK_DeleteTaskFromReadyList(pTask);
		pTask->t_PortPending = TRUE;

		MK_InsertTaskToPendingList(&MK_TaskPortPendingList, pTask);
		if(Ticks > 0)
		{
			MK_InsertTaskToDelayedList(pTask, Ticks);
		}

		MK_Schedule();

		if(pTask->t_Status & MK_TASK_PENDING)
		{
			MK_DeleteTaskFromPendingList(&MK_TaskPortPendingList, pTask);

			MK_KernelInfoPrintf((MK_TASK_WARNING, "MK_TaskPortReceive() - Timeout! Task(%s)\n", MK_GetCurrentTask()->t_pName));
			MK_InterruptRestore(Flags);
			return MK_TIMEOUT;
		}
		else
		{
			*Value = pTask->t_PortValue;
			pTask->t_PortValueAvailable = FALSE;
			pTask->t_PortPending = FALSE;
		}
	}

	MK_InterruptRestore(Flags);
	return MK_NO_ERROR;
}

VOID
MK_TaskPortClear(VOID)
{
	MK_TASK *pTask;
	INT		Flags;

	Flags = MK_InterruptDisable();

	pTask = MK_GetCurrentTask(); 
	pTask->t_PortPending = FALSE;
	pTask->t_PortValueAvailable = FALSE;

	MK_InterruptRestore( Flags );
}

#endif

⌨️ 快捷键说明

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