⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 os_core.c

📁 P89V51在KEILC51中的小操作系统RTOS51大模式下的源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
/*********************************************************************************************************
**				                               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日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
        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();
    }
}


/*********************************************************************************************************
** 函数名称: OSTaskSuspend
** 功能描述: 使指定任务休眠
** 输 入: TaskID : 任务ID
** 输 出: 无
** 全局变量: OSWaitTick
** 调用模块: OS_TaskSuspend,OSSched
**
** 作 者: 陈明计
** 日 期: 2003年8月3日
**-------------------------------------------------------------------------------------------------------

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -