/*********************************************************************************************************
** Small RTOS(51)
** The Real-Time Kernel(For Keil c51)
**
** (c) Copyright 2002-2003, chenmingji
** All Rights Reserved
**
** V1.20.1
**
**
**--------------文件信息--------------------------------------------------------------------------------
**文 件 名: OS_CORE.C
**创 建 人: 陈明计
**最后修改日期: 2004年2月4日
**描 述: Small RTOS(51)与CPU无关的核心代码
**
**--------------历史版本信息----------------------------------------------------------------------------
** 创建人: 陈明计
** 版 本: V0.50~V1.00
** 日 期: 2002年2月22日~2002年6月20日
** 描 述: 基本完成Small RTOS核
**
**------------------------------------------------------------------------------------------------------
** 修改人: 陈明计
** 版 本: V1.10~V1.21
** 日 期: 2002年9月1日~2003年1月23日
** 描 述: 完善Small RTOS
**
**------------------------------------------------------------------------------------------------------
** 修改人: 陈明计
** 版 本: V1.20.0
** 日 期: 2003年8月17日
** 描 述: 增加支持任务动态建立和删除,函数功能向一般的RTOS靠齐
**
**------------------------------------------------------------------------------------------------------
** 修改人: 陈明计
** 版 本: V1.20.1
** 日 期: 2004年2月4日
** 描 述: 修改OSWait(K_SIG | K_TMO, x) 只能通过信号唤醒的bug。
**
**--------------当前版本修订------------------------------------------------------------------------------
** 修改人:
** 日 期:
** 描 述:
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#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;
/*********************************************************************************************************
** 函数名称: OSInit
** 功能描述: 系统变量初始化
** 输 入: 无
** 输 出: 无
** 全局变量:
** 调用模块: 无
**
** 作 者: 陈明计
** 日 期: 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();
}
/*********************************************************************************************************
** 函数名称: _OSTaskCreate
** 功能描述: 创建任务
** 输 入: TaskID:任务ID
** task :任务地址
** ptos :任务堆栈,在51中为重入栈
** 输 出: 无
** 全局变量:
** 调用模块: 无
**
** 作 者: 陈明计
** 日 期: 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;
}
/*********************************************************************************************************
** 函数名称: OSTaskDel
** 功能描述: 删除任务
** 输 入: TaskID:任务ID
** 输 出: 无
** 全局变量:
** 调用模块: 无
**
** 作 者: 陈明计
** 日 期: 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;
}
}
/*********************************************************************************************************
** 函数名称: OSTaskResume
** 功能描述: 恢复任务
** 输 入: TaskID : 任务ID
** 输 出: 无
** 全局变量: OSTaskRuning
** 调用模块: 无
**
** 作 者: 陈明计
** 日 期: 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(); //开始任务切换
}
/*********************************************************************************************************
** 函数名称: OS_TaskSuspend
** 功能描述: 使指定任务休眠,但不进行任务切换
** 输 入: TaskID : 任务ID
** 输 出: 无
** 全局变量: OSWaitTick
** 调用模块: 无
**
** 作 者: 陈明计
** 日 期: 2003年8月3日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-----------------------------------------------------------------------------------------
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
small-RTOS(51).zip (50个子文件)
small RTOS
KEILC51
OS_CPU_C.C 10KB
OS_CPU_A.ASM 19KB
_desktop.ini 9B
OS
OS_Q.H 7KB
OS_SEM.H 5KB
OS.H 10KB
OS_CORE.C 18KB
OS_MEM.C 9KB
OS_Q.C 18KB
_desktop.ini 9B
OS_MEM.H 4KB
OS_SEM.C 12KB
_desktop.ini 9B
object
STARTUP.LST 11KB
OS_CPU_C.obj 12KB
ld_os.uvproj 14KB
ld_os.hex 5KB
ld_os_Opt.Bak 2KB
OS_CPU_C.lst 16KB
MAIN.C 2KB
ld_os.lnp 170B
test.LST 8KB
STARTUP.A51 5KB
ld_os.plg 942B
OS_SEM.lst 19KB
OS_MEM.lst 14KB
OS_CFG.H 6KB
OS_SEM.obj 12KB
MAIN.OBJ 13KB
ld_os 66KB
ld_os.opt.bak 2KB
OS_Q.obj 8KB
ld_os.uvgui_Peng.bak 72KB
OS_CORE.obj 16KB
_desktop.ini 9B
OS_MEM.obj 8KB
CONFIG.H 3KB
STARTUP.OBJ 749B
ld_os_Uv2.Bak 2KB
MAIN.LST 5KB
OS_CPU.H 5KB
OS_CPU_A.lst 51KB
test.OBJ 13KB
ld_os.Uv2.bak 2KB
OS_CORE.lst 28KB
ld_os.M51 8KB
OS_Q.lst 29KB
OS_CPU_A.obj 2KB
ld_os.uvopt 10KB
ld_os.uvgui.Peng 72KB
共 50 条
- 1
资源评论
请叫我-程少爷
- 粉丝: 11
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功