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

📄 os_core.c

📁 陈明计先生的RTOS,堪称经典
💻 C
字号:
/*********************************************************************************************************
**                                        Small RTOS
**                                   The Real-Time Kernel
**                           (c) Copyright 2002-2003, chenmingji
**                                     All Rights Reserved
**                                         V1.50.0
**
**--------------文件信息--------------------------------------------------------------------------------
**文   件   名: OS_CORE.C
**创   建   人: 陈明计
**最后修改日期: 2004年9月5日
**描        述: Small RTOS与CPU无关的核心代码
**
**--------------历史版本信息----------------------------------------------------------------------------
** 创建人: 陈明计
** 版  本: V1.00
** 日 期: 2004年9月5日
** 描 述: 基本完成全新的Small RTOS核
**
**------------------------------------------------------------------------------------------------------
** 修改人:
** 版  本:
** 日 期:
** 描 述:
**
**--------------当前版本修订------------------------------------------------------------------------------
** 修改人: 
** 日 期:
** 描 述:
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/

#define  IN_OS_CORE
#define  IN_OS
#include "config.h"

OS_TCB_PRIO         OSTCBPrioTbl[OS_LOWEST_PRIO];   /* 优先级控制块             */
OS_TCB              OSTCBTbl[OS_MAX_TASKS + 1];     /* 任务控制块               */

OS_TCB              *OSTCBCur;                      /* 当前任务控制块           */
OS_TCB              *OSTCBHighRdy;                  /* 新任务控制块             */
uint8               OSHighPrio;                     /* 就绪的任务的最高优先级   */

uint8               OSIntNesting;                   /* 中断嵌套层次             */
uint8               OsEnterSum;                     /* 关中断嵌套层次           */

//const uint8 OSMapTbl[] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x00};

/*********************************************************************************************************
** 函数名称: OSVersion
** 功能描述: 获取Small RTOS 版本号
** 输 入: 无
** 输 出: 版本号*100
** 作 者: 陈明计
** 日 期: 2004年9月5日
**-------------------------------------------------------------------------------------------------------
** 修改人: 
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
        uint16 OSVersion(void)
{
    return OS_VERSION;
}


/*********************************************************************************************************
** 函数名称: OSInit
** 功能描述: 系统初始化
** 输 入: 无
** 输 出: OS_NO_ERR
** 作 者: 陈明计
** 日 期: 2004年9月5日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
        uint8 OSInit(void)
{
    uint8 i1;
    uint32 i2;
    OS_TCB_PRIO *tcbp;
    OS_TCB *tcb;

    /* 初始化优先级控制块 */
    tcbp = OSTCBPrioTbl;
    for (i1 = 0; i1 < OS_LOWEST_PRIO - 1; i1++)
    {
        tcbp->OSTCBDly = 0;
        tcbp->OSTCBDlyReload = 10;
        tcbp->TcbNext= NULL;
        tcbp++;
    }
    tcbp->OSTCBDly = 0;
    tcbp->OSTCBDlyReload = 0;
    tcbp->TcbNext = OSTCBTbl + OS_MAX_TASKS;     /* 空闲任务 */

    /* 初始化任务控制块 */
    tcb = &(OSTCBTbl[0]);
    for (i2 = 0; i2 < OS_MAX_TASKS; i2++)
    {
        tcb->OSTCBStat = OS_STAT_DEATH;
        tcb->OSTCBInfo = OS_INFO_MSG_SENGED;
        tcb->OSTCBDly = 0;
        tcb->OSTCBId = i2;
        tcb->TcbNext = NULL;
#if OS_MAX_EVENTS > 0
        tcb->EventNext = NULL;
        tcb->EventPrev = NULL;
#endif
#if EN_OS_MSG > 0
        tcb->Msg = NULL;
        tcb->MsgHard = NULL;
        tcb->MsgEnd = NULL;
        tcb->MsgNext = NULL;
#endif
        tcb++;
    }
    
    /* 初始化空闲任务 */
    tcb->OSTCBStat = 0;
    tcb->OSTCBInfo = OS_INFO_MSG_SENGED;
    tcb->OSTCBPrio = OS_LOWEST_PRIO;
    tcb->OSTCBDly = 0;
    tcb->OSTCBId = OS_MAX_TASKS;
    tcb->TcbNext = NULL;
    tcb->TcbPrev = NULL;
#if OS_MAX_EVENTS > 0
    tcb->EventNext = NULL;
    tcb->EventPrev = NULL;
#endif
#if EN_OS_MSG > 0
    tcb->Msg = NULL;
    tcb->MsgHard = NULL;
    tcb->MsgEnd = NULL;
    tcb->MsgNext = NULL;
#endif

    
    /* 初始化其它变量 */
    OSTCBCur = tcb;
    OSTCBHighRdy = tcb;
    OsEnterSum = 0;
    OSIntNesting = 0;
    OSTickCnt = 0;
    OSTickThisCnt = 0;
    OSHighPrio = OS_LOWEST_PRIO;
    OSTCBTimeDly = NULL;
    
    OSEventinit();                  /* 事件控制初始化代码       */
    OSCPUInit();                    /* 目标CPU的特殊初始化代码  */
    return OS_NO_ERR;
}
/*********************************************************************************************************
** 函数名称: OSSetRoundTick
** 功能描述: 设置指定优先级的任务的轮询时间
** 输 入: Prio:要设置的优先级
**         Ticks:轮询时间
** 输 出: OS_NO_ERR
** 作 者: 陈明计
** 日 期: 2004年9月5日
**-------------------------------------------------------------------------------------------------------
** 修改人: 
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
        uint8 OSSetRoundTick(uint8 Prio, uint16 Ticks)
{
    OS_ENTER_CRITICAL();
    if (Prio <= OS_LOWEST_PRIO)                     /* 优先级存在               */
    {
        OSTCBPrioTbl[Prio].OSTCBDlyReload = Ticks;  /* 设置轮询时间             */
        OSTCBPrioTbl[Prio].OSTCBDly = Ticks;        /* 设置当次轮询时间         */
        if (OSTCBCur->OSTCBPrio == Prio)            /* 如果是当前任务           */
        if (OSTickCnt == 0)                         /* 没有任务需要时间服务延时 */
        {
                                                    /* 启动时间服务             */
            OSTickCnt = Ticks;                  
            OSTickThisCnt = Ticks;
        }
    }
    OS_EXIT_CRITICAL();
    return OS_NO_ERR;
}

/*********************************************************************************************************
** 函数名称: OSFindNextRunningTask
** 功能描述: 查找下一个优先级最高的就绪任务
** 输 入: 无
** 输 出: OS_NO_ERR
** 作 者: 陈明计
** 日 期: 2004年9月5日
**-------------------------------------------------------------------------------------------------------
** 修改人: a
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
        uint8 OSFindNextRunningTask(void)
{
    OS_TCB_PRIO *tcbp;
    uint8 temp;

    temp = OSHighPrio;                      /* 从优先级OSHighPrio处开始查找 */
    tcbp = &(OSTCBPrioTbl[temp]);
    while (1)
    {
        if (tcbp->TcbNext != NULL)          /* 相应的优先级有任务就绪       */
        {
            OSTCBHighRdy = tcbp->TcbNext;   /* 获取将要运行的任务的TCB      */
            OSHighPrio = temp;              /* 设置下次查找起始点           */
            if (OSTickCnt == 0)             /* 没有任务需要时间服务延时     */
            if (tcbp->OSTCBDly != 0)        /* 新优先级需要轮询服务         */
            {
                
                                            /* 启动时间服务                 */
                OSTickCnt = tcbp->OSTCBDly;
                OSTickThisCnt = OSTickCnt;
            }
            break;
        }
        tcbp++;
        temp++;
    }
    return OS_NO_ERR;
}

/*********************************************************************************************************
** 函数名称: OSIntExit
** 功能描述: 中断退出处理函数,在此进行中断后的任务切换
** 输 入: 无
** 输 出: TRUE:需要进行任务切换
**         FALSE:不需要进行任务切换
** 作 者: 陈明计
** 日 期: 2004年9月5日
**-------------------------------------------------------------------------------------------------------
** 修改人: 
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
        uint8 OSIntExit(void)

{
    OS_ENTER_CRITICAL();
                /* 中断嵌套处理 */
    if (OSIntNesting > 0)
    {
        OSIntNesting--;
    }
    if (OSIntNesting == 0)
    {
        OsEnterSum = 0;                 /* 因为在中断中,所以关中断计数器为0 */
        OSFindNextRunningTask();
        if (OSTCBCur != OSTCBHighRdy)
        {
            OSIntCtxSw();               /* 进行任务调度 */
        }
        return TRUE;
    }
    OS_EXIT_CRITICAL();
    return FALSE;
}

/*********************************************************************************************************
** 函数名称: OSSched
** 功能描述: 非中断的任务切换函数
** 输 入: 无
** 输 出: OS_NO_ERR
** 作 者: 陈明计
** 日 期: 2004年9月5日
**------------------------------------------------------------------------------------------------------
** 修改人: 
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
        uint8  OSSched(void)
{
    OS_ENTER_CRITICAL();
    if (OSIntNesting == 0)              /* 是否是中断中调用 */
    {
        OSFindNextRunningTask();
        if (OSTCBCur != OSTCBHighRdy)
        {
            OS_TASK_SW();               /* 进行任务调度 */
        }
    }
    OS_EXIT_CRITICAL();
    return OS_NO_ERR;
}


/*********************************************************************************************************
**                            End Of File
********************************************************************************************************/

⌨️ 快捷键说明

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