?? os_core.c
字號(hào):
/*************************************************************************
* 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 : 全局?jǐn)?shù)據(jù)空間定義
*
*************************************************************************/
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 : 操作系統(tǒng)初始化
*
*************************************************************************/
void OSInit(void) small
{
OSTaskID = OS_MAX_TASKS;
OSNextTaskID = 0;
OSCPUInit();
}
/*************************************************************************
*
* MODEL NAME : OSTaskCreate
* DESCRIPTION : 任務(wù)建立
*
*************************************************************************/
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]; //任務(wù)建立標(biāo)記
OSTaskRuning |= OSMapTbl[TaskID]; //任務(wù)運(yùn)行就緒標(biāo)記
OSTaskStkInit(task, ptos, TaskID); //
return TRUE;
}
return FALSE;
}
/*************************************************************************
*
* MODEL NAME : OSTaskResume
* DESCRIPTION : 任務(wù)恢復(fù)
*
*************************************************************************/
void OSTaskResume(UINT8 TaskID) small
{
if(TaskID<OS_MAX_TASKS)
OSTaskRuning |= OSMapTbl[TaskID];
}
/*************************************************************************
*
* MODEL NAME : OSTaskSuspend
* DESCRIPTION : 任務(wù)休眠
*
*************************************************************************/
void OSTaskSuspend(UINT8 TaskID) small
{
if (TaskID < OS_MAX_TASKS)
{
OSTaskRuning &= ~OSMapTbl[TaskID];
}
}
/*************************************************************************
*
* MODEL NAME : OSFindNextRunningTask
* DESCRIPTION : 查找下個(gè)運(yùn)行任務(wù)
*
*************************************************************************/
void OSFindNextRunningTask(void) small
{
UINT8 temp;
temp = OSTaskRuning & OSTaskCreated;
/* 查找處于就緒狀態(tài)最高優(yōu)先級(jí)任務(wù) */
for (OSNextTaskID = 0; OSNextTaskID < OS_MAX_TASKS+1; OSNextTaskID++)
{
if ( temp & 0x01 )
{
return;//break;
}
temp = temp >> 1;
}
return;
}
/*************************************************************************
*
* MODEL NAME : OSSched
* DESCRIPTION : 任務(wù)調(diào)度
*
*************************************************************************/
void OSSched(void) small
{
OSFindNextRunningTask();
if(OSNextTaskID!=OSTaskID)
{
OS_TASK_SW(); /* 進(jìn)行任務(wù)調(diào)度 */
}
}
/*************************************************************************
*
* MODEL NAME : OSTimeTick
* DESCRIPTION : 時(shí)鐘處理函數(shù)
*
*************************************************************************/
//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 : 任務(wù)休眠
*
*************************************************************************/
void OSSleep(UINT8 ticks) small
{
// EA=0;
OSTaskSuspend(OSTaskID);
OSWaitTick[OSTaskID] = ticks; /* 設(shè)置超時(shí)時(shí)間 */
// EA=1;
if(ticks)
{
OSSched(); /* 任務(wù)切換 */
}
}
/*************************************************************************
*
* MODEL NAME : OSWakeup
* DESCRIPTION : 任務(wù)喚醒
*
*************************************************************************/
void OSWakeup(UINT8 TaskID) small
{
OSWaitTick[TaskID] = 0;
OSTaskResume(TaskID);
}
/*************************************************************************
*
* MODEL NAME : OSTimeDly
* DESCRIPTION : 任務(wù)延時(shí)
*
*************************************************************************/
void OSTimeDly(UINT8 ticks) small
{
UINT8 tmp;
tmp = OSWaitTick[OSTaskID];
if(ticks)
{
OSWaitTick[OSTaskID] = ticks; /* 設(shè)置超時(shí)時(shí)間 */
while(OSWaitTick[OSTaskID]);
OSWaitTick[OSTaskID]=tmp;
}
}
/* The end of file */
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -