uC/OS-II源码解析(os_core.c)

/*
** ver: 2.52
** file: OS_CORE.C
** brief: 内核核心服务
*/

#ifndef  OS_MASTER_FILE          /* 防止重复定义宏 OS_GLOBALS 和重复包含头文件 "includes.h"  */
#define  OS_GLOBALS              /* 防止重复定义                                             */
#include "includes.h"            /* 包含头文件                                               */
#endif

/* MAP表,使任务进入或脱离就绪状态时间确定 */
INT8U  const  OSMapTbl[]   = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80};

/* MAP表,用于快速找出进入就绪态优先级最高的任务 */
INT8U  const  OSUnMapTbl[] = {
    0, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x00 to 0x0F              */
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x10 to 0x1F              */
    5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x20 to 0x2F              */
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x30 to 0x3F              */
    6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x40 to 0x4F              */
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x50 to 0x5F              */
    5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x60 to 0x6F              */
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x70 to 0x7F              */
    7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x80 to 0x8F              */
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x90 to 0x9F              */
    5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0xA0 to 0xAF              */
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0xB0 to 0xBF              */
    6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0xC0 to 0xCF              */
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0xD0 to 0xDF              */
    5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0xE0 to 0xEF              */
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0        /* 0xF0 to 0xFF              */
};

/*
**********************************************************************************************
*                                       函数声明
**********************************************************************************************
*/
static  void  OS_InitEventList(void);
static  void  OS_InitMisc(void);
static  void  OS_InitRdyList(void);
static  void  OS_InitTaskIdle(void);
static  void  OS_InitTaskStat(void);
static  void  OS_InitTCBList(void);

/*
**********************************************************************************************
*                                             初始化
*
* brief: 操作系统初始化,必须在 OSTaskCreate()/OSTaskCreateExt() 和 OSStart() 之前调用
*
**********************************************************************************************
*/

void  OSInit (void)
{
#if OS_VERSION >= 204
    OSInitHookBegin();                                       /* 调用钩子函数,用户自定义代码  */
#endif

    OS_InitMisc();                                           /* 初始化杂项变量                */

    OS_InitRdyList();                                        /* 初始化就绪表             */
    OS_InitTCBList();                                        /* 初始化空的任务控制块链表      */
    OS_InitEventList();                                      /* 初始化空事件控制块链表        */

#if (OS_VERSION >= 251) && (OS_FLAG_EN > 0) && (OS_MAX_FLAGS > 0)
    OS_FlagInit();                                           /* 初始化事件标志组              */
#endif

#if (OS_MEM_EN > 0) && (OS_MAX_MEM_PART > 0)
    OS_MemInit();                                            /* 初始化内存管理                */
#endif

#if (OS_Q_EN > 0) && (OS_MAX_QS > 0)
    OS_QInit();                                              /* 初始化消息队列                */
#endif

    OS_InitTaskIdle();                                       /* 创建空闲任务   */
#if OS_TASK_STAT_EN > 0
    OS_InitTaskStat();                                       /* 创建统计任务             */
#endif

#if OS_VERSION >= 204
    OSInitHookEnd();                                         /* 调用钩子函数,用户自定义代码  */
#endif
}
/*$PAGE*/
/*
************************************************************************************************
*                                              进入中断服务程序
*
* brief: 该函数用来通知ucos即将进入中断服务程序,ucos可以跟踪变量 OSIntNesting,
*        只有在最后一层中断退出后才能进行任务调度
*
************************************************************************************************
*/

void  OSIntEnter (void)
{
    if (OSRunning == TRUE) {
   
        if (OSIntNesting < 255) {
   
            OSIntNesting++;                                  /* 中断嵌套层数加 1              */
        }
    }
}
/*$PAGE*/
/*
************************************************************************************************
*                                               退出中断服务程序
*
* brief: 该函数用来通知ucos即将推出中断服务程序,如果是最后一层中断,即可进行任务调度
*
************************************************************************************************
*/

void  OSIntExit (void)
{
#if OS_CRITICAL_METHOD == 3                                
    OS_CPU_SR  cpu_sr;
#endif


    if (OSRunning == TRUE) {
   
        OS_ENTER_CRITICAL();
        if (OSIntNesting > 0) {                            /* 防止越界                      */
            OSIntNesting--;
        }/* 调度器未锁 不在中断内允许任务调度 */
        if ((OSIntNesting == 0) && (OSLockNesting == 0)) {
   
            OSIntExitY    = OSUnMapTbl[OSRdyGrp];         
            OSPrioHighRdy = (INT8U)((OSIntExitY << 3) + OSUnMapTbl[OSRdyTbl[OSIntExitY]]);
            if (OSPrioHighRdy != OSPrioCur) {              
                OSTCBHighRdy  = OSTCBPrioTbl[OSPrioHighRdy];
                OSCtxSwCtr++;                              /* 任务切换次数加一              */
                OSIntCtxSw();                              /* 中断级的任务切换              */
            }
        }
        OS_EXIT_CRITICAL();
    }
}
/*$PAGE*/
/*
**********************************************************************************************
*                                          调度器上锁
*
* brief: 该函数用来禁止进行任务调度

*
* note : OSSchedLock() 和 OSSchedUnlock() 必须成对出现
**********************************************************************************************
*/

#if OS_SCHED_LOCK_EN > 0
void  OSSchedLock (void)
{
#if OS_CRITICAL_METHOD == 3                    
    OS_CPU_SR  cpu_sr;
#endif    


    if (OSRunning == TRUE) {                     
        OS_ENTER_CRITICAL();
        if (OSLockNesting < 255) {               /* 防止 OSLockNesting 越界变成 0    */
            OSLockNesting++;                     /* 增加调度器锁的层数               */
        }
        OS_EXIT_CRITICAL();
    }
}
#endif    

/*$PAGE*/
/*
**************************************************************************************
*                                          调度器解锁
*
* brief: 该函数用来允许任务调度
*
* note : OSSchedLock() 和 OSSchedUnlock() 必须成对出现
*************************************
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

七七云享

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值