📄 os_core.c
字号:
/*
*********************************************************************************************************
* 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 "..\test\SRC\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)
{ /* Prevent OSIntNesting from wrapping */
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*/
/*
*********************************************************************************************************
* 给调度上锁
*
* 函数描述: 该函数用于防止调度再次发生。直到允许任务切换时,才可发生任务切换。
*
* 输入参数 : 无
*
* 返回值 : 无
*
* 注释 : 必须成对调用 OSSchedLock()和 OSSchedUnlock() 函数。
*********************************************************************************************************
*/
#if OS_SCHED_LOCK_EN > 0
void OSSchedLock (void)
{
#if OS_CRITICAL_METHOD == 3 /* 为CPU状态寄存器分配存储变量 */
OS_CPU_SR cpu_sr;
#endif
if (OSRunning == TRUE)
{ /* 判断多任务正在运行 */
OS_ENTER_CRITICAL();
if (OSLockNesting < 255)
{ /* 防止 OSLockNesting 退回到 0 */
OSLockNesting++; /* 增加上锁嵌套层数 */
}
OS_EXIT_CRITICAL();
}
}
#endif
/*$PAGE*/
/*
*********************************************************************************************************
* 给调度解锁
*
* 函数描述: 该函数用于重新允许调度
*
* 输入参数 : 无
*
* 返回值 : 无
*
* 注释 : 必须成对调用 OSSchedLock()和 OSSchedUnlock() 函数。
*********************************************************************************************************
*/
#if OS_SCHED_LOCK_EN > 0
void OSSchedUnlock (void)
{
#if OS_CRITICAL_METHOD == 3 /* 为CPU状态寄存器分配存储变量 */
OS_CPU_SR cpu_sr;
#endif
if (OSRunning == TRUE)
{ /* 判断多任务正在运行 */
OS_ENTER_CRITICAL();
if (OSLockNesting > 0)
{ /* 如果已经为0,不减 */
OSLockNesting--; /* 减少上锁嵌套等级 */
if ((OSLockNesting == 0) && (OSIntNesting == 0))
{ /* 看是否解锁,且不在中断内? */
OS_EXIT_CRITICAL();
OS_Sched(); /* 如果最高优先级就绪 */
}
else
{
OS_EXIT_CRITICAL();
}
}
else
{
OS_EXIT_CRITICAL();
}
}
}
#endif
/*$PAGE*/
/*
*********************************************************************************************************
* 多任务开始
*
* 函数描述: 该函数启动多任务开始,让 uC/OS-II 管理所创建的任务。在调用OSStart()之前,必须调用 OSInit(),
* 必须创建至少一个任务。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -