?? os_core.c
字號:
/*************************************************************************
* Point RTOS(51) *
* The Real-Time Kernel(For Keil c51) *
* *
* (c) Copyright 2005, PenGH *
* All Rights Reserved *
* *
* V0.9.1 *
* *
* File : OS_CORE.C *
* Author : 彭光紅 *
* History :
* 2005/08 By PenGH
*************************************************************************/
/*----------------------------------------------------------------------*/
#define __IN_OS_CORE__
#include ".\include\config.h"
/*************************************************************************
*
* MODEL NAME : IDATA
* DESCRIPTION : 全局數據空間定義
*
*************************************************************************/
UINT8 data OSTaskID;
UINT8 data OSNextTaskID;
UINT8 data OSWaitTick[OS_MAX_TASKS+1];
UINT8 data OSTaskRuning;
UINT8 data OSTaskCreated;
UINT8 const OSMapTbl[]={0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80};
/*************************************************************************
*
* MODEL NAME : OSInit
* DESCRIPTION : 操作系統初始化
*
*************************************************************************/
void OSInit(void) small
{
OSTaskID = OS_MAX_TASKS;
OSNextTaskID = 0;
OSCPUInit();
}
/*************************************************************************
*
* MODEL NAME : OSTaskCreate
* DESCRIPTION : 任務建立
*
*************************************************************************/
UINT8 _OSTaskCreate(UINT8 TaskID, \
void (code * task)(void), \
void xdata *ptos) small
{
extern idata UINT8 STACK[];
if (TaskID < OS_MAX_TASKS+1)
{
if ((OSTaskCreated & OSMapTbl[TaskID]) != 0)
{
return FALSE;
}
OSTaskCreated |= OSMapTbl[TaskID]; //任務建立標記
OSTaskRuning |= OSMapTbl[TaskID]; //任務運行就緒標記
OSTaskStkInit(task, ptos, TaskID); //
return TRUE;
}
return FALSE;
}
/*************************************************************************
*
* MODEL NAME : OSTaskResume
* DESCRIPTION : 任務恢復
*
*************************************************************************/
void OSTaskResume(UINT8 TaskID) small
{
if(TaskID<OS_MAX_TASKS)
OSTaskRuning |= OSMapTbl[TaskID];
}
/*************************************************************************
*
* MODEL NAME : OSTaskSuspend
* DESCRIPTION : 任務休眠
*
*************************************************************************/
void OSTaskSuspend(UINT8 TaskID) small
{
if (TaskID < OS_MAX_TASKS)
{
OSTaskRuning &= ~OSMapTbl[TaskID];
}
}
/*************************************************************************
*
* MODEL NAME : OSFindNextRunningTask
* DESCRIPTION : 查找下個運行任務
*
*************************************************************************/
void OSFindNextRunningTask(void) small
{
UINT8 temp;
temp = OSTaskRuning & OSTaskCreated;
/* 查找處于就緒狀態最高優先級任務 */
for (OSNextTaskID = 0; OSNextTaskID < OS_MAX_TASKS+1; OSNextTaskID++)
{
if ( temp & 0x01 )
{
return;//break;
}
temp = temp >> 1;
}
return;
}
/*************************************************************************
*
* MODEL NAME : OSSched
* DESCRIPTION : 任務調度
*
*************************************************************************/
void OSSched(void) small
{
OSFindNextRunningTask();
if(OSNextTaskID!=OSTaskID)
{
OS_TASK_SW(); /* 進行任務調度 */
}
}
/*************************************************************************
*
* MODEL NAME : OSTimeTick
* DESCRIPTION : 時鐘處理函數
*
*************************************************************************/
//void OSTimeTick(void) small
//{
// UINT8 i;
//
// for (i = 0; i < OS_MAX_TASKS+1; i++)
// {
// if (OSWaitTick[i] != 0 )
// {
// OSWaitTick[i]--;
// if (OSWaitTick[i] == 0)
// {
// OSTaskRuning |= OSMapTbl[i];
// }
// }
// }
//}
/*************************************************************************
*
* MODEL NAME : OSSleep
* DESCRIPTION : 任務休眠
*
*************************************************************************/
void OSSleep(UINT8 ticks) small
{
// EA=0;
OSTaskSuspend(OSTaskID);
OSWaitTick[OSTaskID] = ticks; /* 設置超時時間 */
// EA=1;
if(ticks)
{
OSSched(); /* 任務切換 */
}
}
/*************************************************************************
*
* MODEL NAME : OSWakeup
* DESCRIPTION : 任務喚醒
*
*************************************************************************/
void OSWakeup(UINT8 TaskID) small
{
OSWaitTick[TaskID] = 0;
OSTaskResume(TaskID);
}
/*************************************************************************
*
* MODEL NAME : OSTimeDly
* DESCRIPTION : 任務延時
*
*************************************************************************/
void OSTimeDly(UINT8 ticks) small
{
UINT8 tmp;
tmp = OSWaitTick[OSTaskID];
if(ticks)
{
OSWaitTick[OSTaskID] = ticks; /* 設置超時時間 */
while(OSWaitTick[OSTaskID]);
OSWaitTick[OSTaskID]=tmp;
}
}
/* The end of file */
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -