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

📄 os_core.c

📁 SmallRTOSAVR.rar
💻 C
📖 第 1 页 / 共 2 页
字号:
/*********************************************************************************************************
**                                        Small RTOS
**                                   The Real-Time Kernel
**                           (c) Copyright 2002-2003, chenmingji
**                                     All Rights Reserved
**                                         V1.50.0
**
**--------------文件信息--------------------------------------------------------------------------------
**文   件   名: OS_CORE.C
**创   建   人: 陈明计
**最后修改日期:  2005年6月10日
**描        述: Small RTOS与CPU无关的核心代码
**
**--------------历史版本信息----------------------------------------------------------------------------
** 创建人: 陈明计
** 版  本: V1.00
** 日 期:  2005年6月10日
** 描 述: 基本完成全新的Small RTOS核
**
**------------------------------------------------------------------------------------------------------
** 修改人:
** 版  本:
** 日 期:
** 描 述:
**
**--------------当前版本修订------------------------------------------------------------------------------
** 修改人: 焦进星
** 日 期: 2007年12月30日
** 描 述: 移植到AVR系列芯片,适用于atmega16/32等
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/

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



OS_TCB_PRIO         OSTCBPrioTbl[OS_LOWEST_PRIO + 1];   /* 优先级控制块             */
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};

register unsigned char SREGTEMP asm("r2"); 

/*防止被编译器占用*/ 
register unsigned char tempR3  asm("r3"); 
register unsigned char tempR4  asm("r4"); 
register unsigned char tempR5  asm("r5");
register unsigned char tempR6  asm("r6"); 
register unsigned char tempR7  asm("r7"); 
register unsigned char tempR8  asm("r8"); 
register unsigned char tempR9  asm("r9"); 
register unsigned char tempR10 asm("r10"); 
register unsigned char tempR11 asm("r11"); 
register unsigned char tempR12 asm("r12"); 
register unsigned char tempR13 asm("r13"); 
register unsigned char tempR14 asm("r14"); 
register unsigned char tempR15 asm("r15"); 
register unsigned char tempR16 asm("r16"); 
register unsigned char tempR16 asm("r17"); 

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


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

    /* 初始化优先级控制块 */
    tcbp = OSTCBPrioTbl;
    for (i1 = 0; i1 < OS_LOWEST_PRIO; 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 = tcb;
    tcb->TcbPrev = tcb;
#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();                  /* 事件控制初始化代码       */
    return OS_NO_ERR;
}
/*********************************************************************************************************
** 函数名称: OSSetRoundTick
** 功能描述: 设置指定优先级的任务的轮询时间
** 输 入: Prio:要设置的优先级
**         Ticks:轮询时间
** 输 出: OS_NO_ERR
** 作 者: 陈明计
** 日 期: 2005年6月10日
**-------------------------------------------------------------------------------------------------------
** 修改人: 
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
        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
** 作 者: 陈明计
** 日 期: 2005年6月10日
**-------------------------------------------------------------------------------------------------------
** 修改人: 
** 日 期:

⌨️ 快捷键说明

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