/*
*********************************************************************************************************
* uC/OS-II 实时内核
* 内核函数
*
* (c) 版权 1992-2002, 所有版权归Jean J. Labrosse, Weston, FL 所有
*
*
* 文件名称 : OS_CORE.C
* 程序作者 : Jean J. Labrosse
*********************************************************************************************************
*/
#ifndef OS_MASTER_FILE
#define OS_GLOBALS
#include "includes.h"
#endif
/*
*********************************************************************************************************
* MAPPING TABLE TO MAP BIT POSITION TO BIT MASK
*
* Note: Index into table is desired bit position, 0..7
* Indexed value corresponds to bit mask
*********************************************************************************************************
*/
INT8U const OSMapTbl[] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80};
/*
*********************************************************************************************************
* PRIORITY RESOLUTION TABLE
*
* Note: Index into table is bit pattern to resolve highest priority
* Indexed value corresponds to highest priority bit position (i.e. 0..7)
*********************************************************************************************************
*/
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);
/*$换页*/
/*
*********************************************************************************************************
* 初始化
*
* 函数描述: 该函数用于初始化 uC/OS-II的内部变量和数据结构,并且在创建uC/OS-II之前目标调用,且在调用
* 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
}
/*$换页*/
/*
*********************************************************************************************************
* 进入中断服务函数
*
* 函数描述: 该函数通知 uC/OS-II即将进入中断服务子程序。允许uC/OS-II跟踪中断嵌套,并因此只能在最后的嵌套中断
* 服务子程序中完成再调度。
*
* 输入参数 : 无
*
* 返回值 : 无
*
* 注释 : 1) 该函数应使用关闭的中断调用
* 2) ISR 能直接增加嵌套的值而无需调用函数,因为中断嵌套声明为全局变量。
* 3) 即使直接增加中断嵌套的值也需调用OSIntExit()
* 4) 必须成对调用函数 OSIntEnter() and OSIntExit()
* 5) 中断嵌套深度可达到255 级
* 6) I removed the OS_ENTER_CRITICAL() and OS_EXIT_CRITICAL() around the increment because
* OSIntEnter() is always called with interrupts disabled.
*********************************************************************************************************
*/
void OSIntEnter (void)
{
if (OSRunning == TRUE)
{
if (OSIntNesting < 255)
{
OSIntNesting++; /* 增加中断服务函数的嵌套等级 */
}
}
}
/*$PAGE*/
/*
*********************************************************************************************************
* 退出中断服务函数
*
* 函数描述: 该函数通知 uC/OS-II已完成中断服务子程序. 当完成最后的嵌套中断时,uC/OS-II 将调用调度器决定
* 是否有新的高优先级的任务准备就绪。
* 输入参数: 无
*
* 返回值: 无
*
* 注释 : 1) 必须成对调用函数 OSIntEnter() and OSIntExit()
* 2) 当调度器上锁时,再调度失效 见OSchedLock())
*********************************************************************************************************
*/
void OSIntExit (void)
{
#if OS_CRITICAL_METHOD == 3 /* 为CPU状态寄存器分配存储变量 */
OS_CPU_SR cpu_sr;
#endif
if (OSRunning == TRUE)
{
OS_ENTER_CRITICAL();
if (OSIntNesting > 0)
{ /* P