?? os_core.c
字號(hào):
/*********************************************************************************************************
** Small RTOS(51)
** The Real-Time Kernel(For Keil c51)
**
** (c) Copyright 2002-2003, chenmingji
** All Rights Reserved
**
** V1.20.1
**
**
**--------------文件信息--------------------------------------------------------------------------------
**文 件 名: OS_CORE.C
**創(chuàng) 建 人: 陳明計(jì)
**最后修改日期: 2004年2月4日
**描 述: Small RTOS(51)與CPU無關(guān)的核心代碼
**
**--------------歷史版本信息----------------------------------------------------------------------------
** 創(chuàng)建人: 陳明計(jì)
** 版 本: V0.50~V1.00
** 日 期: 2002年2月22日~2002年6月20日
** 描 述: 基本完成Small RTOS核
**
**------------------------------------------------------------------------------------------------------
** 修改人: 陳明計(jì)
** 版 本: V1.10~V1.21
** 日 期: 2002年9月1日~2003年1月23日
** 描 述: 完善Small RTOS
**
**------------------------------------------------------------------------------------------------------
** 修改人: 陳明計(jì)
** 版 本: V1.20.0
** 日 期: 2003年8月17日
** 描 述: 增加支持任務(wù)動(dòng)態(tài)建立和刪除,函數(shù)功能向一般的RTOS靠齊
**
**------------------------------------------------------------------------------------------------------
** 修改人: 陳明計(jì)
** 版 本: V1.20.1
** 日 期: 2004年2月4日
** 描 述: 修改OSWait(K_SIG | K_TMO, x) 只能通過信號(hào)喚醒的bug。
**
**--------------當(dāng)前版本修訂------------------------------------------------------------------------------
** 修改人:
** 日 期:
** 描 述:
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#define IN_OS_CORE
#include "config.h"
uint8 data OSIntNesting;
uint8 data OSTaskID;
uint8 data OSNextTaskID;
uint8 data OSWaitTick[OS_MAX_TASKS];
#if OS_MAX_TASKS < 9
uint8 data OSTaskRuning[1];
uint8 data OSTaskCreated[1];
#else
uint8 data OSTaskRuning[2];
uint8 data OSTaskCreated[2];
#endif
uint8 const OSMapTbl[] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x00};
uint8 data Os_Enter_Sum;
void OSSched(void) small;
/*********************************************************************************************************
** 函數(shù)名稱: OSInit
** 功能描述: 系統(tǒng)變量初始化
** 輸 入: 無
** 輸 出: 無
** 全局變量:
** 調(diào)用模塊: 無
**
** 作 者: 陳明計(jì)
** 日 期: 2003年8月3日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void OSInit(void) small
{
OSTaskRuning[0] = 0;
OSTaskCreated[0] = 0;
#if OS_MAX_TASKS > 8
OSTaskRuning[1] = 0;
OSTaskCreated[1] = 0;
#endif
Os_Enter_Sum = 0;
OSTaskID = OS_MAX_TASKS;
OSNextTaskID = 0;
OSIntNesting = 0;
OSCPUInit();
}
/*********************************************************************************************************
** 函數(shù)名稱: _OSTaskCreate
** 功能描述: 創(chuàng)建任務(wù)
** 輸 入: TaskID:任務(wù)ID
** task :任務(wù)地址
** ptos :任務(wù)堆棧,在51中為重入棧
** 輸 出: 無
** 全局變量:
** 調(diào)用模塊: 無
**
** 作 者: 陳明計(jì)
** 日 期: 2003年8月3日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 _OSTaskCreate(uint8 TaskID, void (code * task)(void), void xdata *ptos) small
{
if (TaskID < OS_MAX_TASKS)
{
OS_ENTER_CRITICAL();
#if OS_MAX_TASKS < 9
if ((OSTaskCreated[0] & OSMapTbl[TaskID]) != 0)
{
return FALSE;
}
OSTaskCreated[0] |= OSMapTbl[TaskID];
OSTaskRuning[0] |= OSMapTbl[TaskID];
#else
if (TaskID < 8)
{
if ((OSTaskCreated[0] & OSMapTbl[TaskID]) != 0)
{
return FALSE;
}
OSTaskCreated[0] |= OSMapTbl[TaskID];
OSTaskRuning[0] |= OSMapTbl[TaskID];
}
else
{
if ((OSTaskCreated[1] & OSMapTbl[TaskID & 0x07]) != 0)
{
return FALSE;
}
OSTaskCreated[1] |= OSMapTbl[TaskID & 0x07];
OSTaskRuning[1] |= OSMapTbl[TaskID & 0x07];
}
#endif
OSTaskStkInit(task, ptos, TaskID);
OSSched();
OS_EXIT_CRITICAL();
return TRUE;
}
return FALSE;
}
/*********************************************************************************************************
** 函數(shù)名稱: OSTaskDel
** 功能描述: 刪除任務(wù)
** 輸 入: TaskID:任務(wù)ID
** 輸 出: 無
** 全局變量:
** 調(diào)用模塊: 無
**
** 作 者: 陳明計(jì)
** 日 期: 2003年8月3日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 OSTaskDel(uint8 TaskID) small
{
if (TaskID < OS_MAX_TASKS)
{
OS_ENTER_CRITICAL();
#if OS_MAX_TASKS < 9
OSTaskCreated[0] &= ~OSMapTbl[TaskID];
#else
if (TaskID < 8)
{
OSTaskCreated[0] &= ~OSMapTbl[TaskID];
}
else
{
OSTaskCreated[1] &= ~OSMapTbl[TaskID & 0x07];
}
#endif
OSTaskStkDel(TaskID);
OSSched();
OS_EXIT_CRITICAL();
return TRUE;
}
else
{
return FALSE;
}
}
/*********************************************************************************************************
** 函數(shù)名稱: OSTaskResume
** 功能描述: 恢復(fù)任務(wù)
** 輸 入: TaskID : 任務(wù)ID
** 輸 出: 無
** 全局變量: OSTaskRuning
** 調(diào)用模塊: 無
**
** 作 者: 陳明計(jì)
** 日 期: 2003年8月3日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void OSTaskResume(uint8 TaskID) small
{
if (TaskID < OS_MAX_TASKS)
{
OS_ENTER_CRITICAL();
#if OS_MAX_TASKS < 9
OSTaskRuning[0] |= OSMapTbl[TaskID];
#else
if (TaskID < 8)
{
OSTaskRuning[0] |= OSMapTbl[TaskID];
}
else
{
OSTaskRuning[1] |= OSMapTbl[TaskID & 0x07];
}
#endif
OS_EXIT_CRITICAL();
}
OSSched(); //開始任務(wù)切換
}
/*********************************************************************************************************
** 函數(shù)名稱: OS_TaskSuspend
** 功能描述: 使指定任務(wù)休眠,但不進(jìn)行任務(wù)切換
** 輸 入: TaskID : 任務(wù)ID
** 輸 出: 無
** 全局變量: OSWaitTick
** 調(diào)用模塊: 無
**
** 作 者: 陳明計(jì)
** 日 期: 2003年8月3日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void OS_TaskSuspend(uint8 TaskID) small
{
if (TaskID < OS_MAX_TASKS)
{
OS_ENTER_CRITICAL();
#if OS_MAX_TASKS < 9
OSTaskRuning[0] &= ~OSMapTbl[TaskID];
#else
if (TaskID < 8)
{
OSTaskRuning[0] &= ~OSMapTbl[TaskID];
}
else
{
OSTaskRuning[1] &= ~OSMapTbl[TaskID & 0x07];
}
#endif
OS_EXIT_CRITICAL();
}
}
/*********************************************************************************************************
** 函數(shù)名稱: OSTaskSuspend
** 功能描述: 使指定任務(wù)休眠
** 輸 入: TaskID : 任務(wù)ID
** 輸 出: 無
** 全局變量: OSWaitTick
** 調(diào)用模塊: OS_TaskSuspend,OSSched
**
** 作 者: 陳明計(jì)
** 日 期: 2003年8月3日
**-------------------------------------------------------------------------------------------------------
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -