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