/*
** 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() 必须成对出现
*************************************
uC/OS-II源码解析(os_core.c)
最新推荐文章于 2018-08-22 15:12:34 发布