📄 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 + -