/*********************************************************************************************************/<br />/* Copyright (C) Vimman . All Rights Reserved. */<br />/*<br />File : core.c<br />Desc : A simple OS core<br /> <br /><br />Author : Vimman Wang<br />Date : 05/01/2007<br />Notes : <br /><br />$Log : 07/23/2007 引入三个Index变量,用其位来标志任务的状态;缩小代码并提高了效率.<br /> <br />*/<br />/*********************************************************************************************************/<br /><br />#include "includes.h"<br /><br />void SWI_Exception(void)<br />{<br /> <br />}<br />void OsScheduleUserHook(void)<br />{<br /> <br />}<br /><br />void OsAddTaskToIndex(uint32 * pIndex,TCB *pTcb)<br />{<br /> if(pIndex == &gReadyTaskIndex)<br /> {<br /> pTcb->TaskState = TASK_READY;<br /> }<br /> else if(pIndex == &gWaitTaskIndex) pTcb->TaskState = TASK_WAIT;<br /> else if(pIndex == &gSuspendTaskIndex) pTcb->TaskState = TASK_SUSPEND;<br /> *pIndex |= ((uint32)1<<pTcb->TaskId);<br />}<br /><br />void OsDelTaskFromIndex(uint32 * pIndex,TCB *pTcb)<br />{<br /> *pIndex &= ~((uint32)1<<pTcb->TaskId);<br />}<br /><br />void OsRefreshDelayTasks(void)<br />{<br /> TCB * pTcb;<br /> uint32 i;<br /> <br /> for(i = MAX_TASKS-1; i >= 1; i--)<br /> {<br /> if(gWaitTaskIndex & (1<<i))<br /> {<br /> pTcb = TcbIndex;<br /> if(pTcb)<br /> {<br /> if(pTcb->DelayTime == 0)<br /> {<br /> OsAddTaskToIndex(&gReadyTaskIndex,pTcb);<br /> OsDelTaskFromIndex(&gWaitTaskIndex,pTcb);<br /> }<br /> else<br /> pTcb->DelayTime -- ;<br /> }<br /> }<br /> }<br />}<br /><br />TCB * OsGetHighReady(void)<br />{<br /> uint32 i;<br /> TCB * pTcb = TcbIndex[0] ;<br /> for(i = MAX_TASKS-1; i >= 1; i--)<br /> {<br /> if(gReadyTaskIndex & (1<<i))<br /> if(TcbIndex != NULL)<br /> {<br /> pTcb = TcbIndex;<br /> break;<br /> }<br /> }<br /> return pTcb;<br />}<br /><br />void OsTickUpdateTCB(void)<br />{<br /> OsRefreshDelayTasks();<br /> OSTCBCur = OsGetHighReady();<br />}<br /><br /><br />void OsTaskGetDevice(DEVICE * pDevice, uint16 nWaitTime)<br />{<br /> TCB *pTcb = OSTCBCur;<br /><br /> if(pTcb->pOwnDevice == pDevice) <br /> {<br /> return;<br /> }<br /> while(DEVICE_BUSY == GetDeviceState(pDevice))<br /> {<br /> if(nWaitTime == 0) break;<br /> OS_ENTER_CRITICAL();<br /> pTcb->pOwnDevice = 0;<br /> pTcb->DelayTime = nWaitTime;<br /> OsDelTaskFromIndex(&gReadyTaskIndex,pTcb);<br /> OsAddTaskToIndex(&gWaitTaskIndex,pTcb);<br /> OS_EXIT_CRITICAL();<br /> OsSchedule();<br /> }<br /> if(DEVICE_IDLE == GetDeviceState(pDevice) )<br /> {<br /> SendDeviceCmd(pDevice,DEVICE_CMD_OPEN,0);<br /> }<br />}<br /><br />void OsPending(uint16 nPendTime)<br />{<br /> TCB *pTcb = OSTCBCur;<br /> OS_ENTER_CRITICAL();<br /> pTcb->DelayTime = nPendTime;<br /> OsDelTaskFromIndex(&gReadyTaskIndex,pTcb);<br /> OsAddTaskToIndex(&gWaitTaskIndex,pTcb);<br /> OS_EXIT_CRITICAL();<br /> OsSchedule(); <br />}<br />void OsTcbSchedule(void)<br />{<br /> OSTCBCur = OsGetHighReady();<br />}<br /><br />void OsInit(void)<br />{<br /> CreateTask(IdleTask,&Tcbs[0],0,(uint32)&StackIdle[31],0,0);<br /> OSTCBCur = &Tcbs[0];<br />}<br /><br />
|