📄 os_core.c
字号:
#ifndef OS_MASTER_FILE
#define OS_GLOBALS
#include "linos.h"
#endif
static void OS_MemClr(INT8U *pdest,INT16U size);
static void OS_InitMisc(void);
static void OS_InitRdyList(void);
static void OS_InitTCBList(void);
static void OS_InitEventList(void);
static void OS_InitTaskIdle(void);
static void OS_InitTaskStat(void);
INT8U const OSMapTbl[8] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80};
INT8U const OSUnMapTbl[256] = {
0, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0
};
/*
*******************************************************************************
* 系统初始化 *
*******************************************************************************
*/
void OSInit(void)
{
OS_InitMisc();
OS_InitRdyList();
OS_InitTCBList();
OS_InitTaskIdle(); //初始化空闲任务
#if OS_TASK_STAT_EN > 0
OS_InitTaskStat(); //初始化状态任务
#endif
}
/*
*******************************************************************************
* 系统启动程序 *
*******************************************************************************
*/
void OSStart(void)
{
INT8U y;
INT8U x;
if (OSRunning == FALSE) //启动就绪最高优先级任务
{
y = OSUnMapTbl[OSRdyGrp]; //从就绪表中得到最高优先级
x = OSUnMapTbl[OSRdyTbl[y]];
OSPrioHighRdy = (INT8U)((y << 3) + x);
OSPrioCur = OSPrioHighRdy; //把就绪最高优先级设置为当前优先级
OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];
OSTCBCur = OSTCBHighRdy;
OSStartHighRdy(); //启动就绪最高优先级
}
}
/*
*******************************************************************************
* 任务级调度程序 *
*******************************************************************************
*/
void OS_Sched (void)
{
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr;
#endif
INT8U y;
OS_ENTER_CRITICAL();
if(OSIntNesting == 0) //在中断中调用不进行调度
{
if(OSLockNesting == 0)
{
y = OSUnMapTbl[OSRdyGrp]; //得到最高优先级的高三位
OSPrioHighRdy = (INT8U)((y << 3) + OSUnMapTbl[OSRdyTbl[y]]); //得到最高优先级
if(OSPrioHighRdy != OSPrioCur) //最高优先级不等于当前优先级进行系统调度
{
OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];
OSCtxSwCtr++; //系统调度计数
OSCtxSw(); //任务切换
}
}
}
OS_EXIT_CRITICAL();
}
/*
*******************************************************************************
* 中断调度程序 *
*注意:中断进入(一般由汇编直接完成)和中断退出必须成对出现
*******************************************************************************
*/
void OSIntEnter (void)
{
if(OSRunning == TRUE)
{
if(OSIntNesting < 255u)
{
OSIntNesting++;
}
}
}
void OSIntExit (void)
{
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr;
#endif
if(OSRunning == TRUE) //如果系统没有运行则不进行调度
{
OS_ENTER_CRITICAL();
if(OSIntNesting > 0) //如果中断嵌套大于0,减1
{
OSIntNesting--;
}
if(OSIntNesting == 0) //中断嵌套和调度锁定不进行调度
{
if(OSLockNesting == 0)
{
OSIntExitY = OSUnMapTbl[OSRdyGrp]; //得到最高优先级的高三位
OSPrioHighRdy = (INT8U)((OSIntExitY << 3) + OSUnMapTbl[OSRdyTbl[OSIntExitY]]); //得到最高优先级
if(OSPrioHighRdy != OSPrioCur) //最高优先级不等于当前优先级进行系统调度
{
OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];
OSCtxSwCtr++; //系统调度计数
OSIntCtxSw(); //任务切换
} //if(OSPrioHighRdy...
}//if(OSLockNesting...
}//if(OSIntNesting == 0)
}//if(OSRunning...
}
/*
*******************************************************************************
* 调度锁定/解锁程序 *
*注意:调度锁定与调度解锁必须成对使用 *
*******************************************************************************
*/
#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 < 255u)
{
OSLockNesting++;
}
OS_EXIT_CRITICAL();
}
}
void OSSchedUnlock (void)
{
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr;
#endif
if(OSRunning == TRUE)
{
OS_ENTER_CRITICAL();
if(OSLockNesting > 0)
{
OSLockNesting--;
if(OSLockNesting == 0) //如果所有锁定解锁,则进行任务调度
{
if(OSIntNesting == 0)
{
OS_EXIT_CRITICAL();
OS_Sched();
}
else
{
OS_EXIT_CRITICAL();
}//if(OSIntNesting == 0)
}
else
{
OS_EXIT_CRITICAL();
}//if(OSLockNesting == 0)
}
else
{
OS_EXIT_CRITICAL();
}//if(OSLockNesting > 0)
}//if(OSRunning == TRUE)
}
#endif
/*
*******************************************************************************
* 系统定时程序 *
*******************************************************************************
*/
void OSTimeTick (void)
{
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr;
#endif
OS_TCB *ptcb;
#if OS_TIME_GET_SET_EN > 0
OS_ENTER_CRITICAL();
OSTime++;
OS_EXIT_CRITICAL();
#endif
if(OSRunning == TRUE)
{
ptcb = OSTCBList;
while(ptcb->OSTCBPrio != OS_IDLE_PRIO) //为所有任务检查定时
{
OS_ENTER_CRITICAL();
if(ptcb->OSTCBDly != 0)
{
if(--ptcb->OSTCBDly == 0)
{
if((ptcb->OSTCBStat & OS_STAT_SUSPEND) == OS_STAT_RDY) //定时到而任务没有挂起时,设置为就绪态
{
OSRdyGrp |= ptcb->OSTCBBitY;
OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
}
else
{
ptcb->OSTCBDly = 1;
}//if((ptcb->OSTCBStat...
}//if(--ptcb->OSTCBDly...
}//if(ptcb->OSTCBDly...
ptcb = ptcb->OSTCBNext;
OS_EXIT_CRITICAL();
}//while(ptcb->OSTCBPrio...
}//if (OSRunning...
}
/*
*******************************************************************************
* 初始化系统变量 *
*******************************************************************************
*/
void OS_InitMisc(void)
{
#if OS_TIME_GET_SET_EN > 0
OSTime = 0L;
#endif
OSIntNesting = 0;
OSLockNesting = 0;
OSTaskCtr = 0;
OSRunning = FALSE;
OSCtxSwCtr = 0;
OSIdleCtr = 0L;
#if OS_TASK_STAT_EN > 0
OSIdleCtrMax = 0L;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -