📄 os_core.c.bak
字号:
#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_InitTaskIdle(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();
}
/*
*******************************************************************************
* 系统调度程序 *
*******************************************************************************
*/
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]; /* Get pointer to HPT ready to run */
OSPrioHighRdy = (INT8U)((y << 3) + OSUnMapTbl[OSRdyTbl[y]]);
if (OSPrioHighRdy != OSPrioCur) { /* No Ctx Sw if current task is highest rdy */
OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];
#if OS_TASK_PROFILE_EN > 0
OSTCBHighRdy->OSTCBCtxSwCtr++; /* Inc. # of context switches to this task */
#endif
OSCtxSwCtr++; /* Increment context switch counter */
OS_TASK_SW(); /* Perform a context switch */
}
}
}
OS_EXIT_CRITICAL();
}
/*
*******************************************************************************
* 初始化系统变量 *
*******************************************************************************
*/
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;
}
/*
*******************************************************************************
* 初始化就绪表 *
*******************************************************************************
*/
void OS_InitRdyList(void)
{
INT16U i;
OSRdyGrp = 0x00;
for(i=0;i<OS_RDY_TBL_SIZE;i++)
{
OSRdyTbl[i] = 0x00;
}
OSPrioCur = 0;
OSPrioHighRdy = 0;
OSTCBHighRdy = (OS_TCB *)0;
OSTCBCur = (OS_TCB *)0;
}
/*
*******************************************************************************
* 初始化TCBS *
*******************************************************************************
*/
void OS_InitTCBList(void)
{
INT8U i;
OS_TCB *ptcb1;
OS_TCB *ptcb2;
OS_MemClr((INT8U *)&OSTCBTbl[0],sizeof(OSTCBTbl)); //清除所有TCBs
OS_MemClr((INT8U *)&OSTCBPrioTbl[0], sizeof(OSTCBPrioTbl)); //清除优先级指针连表
ptcb1 = &OSTCBTbl[0];
ptcb2 = &OSTCBTbl[1];
for(i=0; i<(OS_MAX_TASKS + OS_N_SYS_TASKS - 1);i++) //初始化空TCBS
{
ptcb1->OSTCBNext = ptcb2; //指向下一个TCB
ptcb1++;
ptcb2++;
}
ptcb1->OSTCBNext = (OS_TCB *)0;
OSTCBList = (OS_TCB *)0; //列表指针初始化
OSTCBFreeList = &OSTCBTbl[0]; //第一个空的TCB
}
/*
*******************************************************************************
* 初始化空闲任务 *
*******************************************************************************
*/
void OS_InitTaskIdle (void)
{
#if OS_STK_GROWTH == 1
(void)OSTaskCreate(OS_TaskIdle,(void *)0,&OSTaskIdleStk[OS_TASK_IDLE_STK_SIZE-1],OS_IDLE_PRIO);
#else
(void)OSTaskCreate(OS_TaskIdle,(void *)0,&OSTaskIdleStk[0],OS_IDLE_PRIO);
#endif
}
/*
*******************************************************************************
* 清除内存块 *
*******************************************************************************
*/
void OS_MemClr(INT8U *pdest,INT16U size)
{
while(size>0)
{
*pdest++ = 0;
size--;
}
}
/*
*******************************************************************************
* 空闲任务程序 *
*******************************************************************************
*/
void OS_TaskIdle(void *parg)
{
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr;
#endif
parg = parg; //清除编译警告
for(;;)
{
OS_ENTER_CRITICAL();
OSIdleCtr++;
OS_EXIT_CRITICAL();
}
}
/*
*******************************************************************************
* 任务产生TCB初始化函数 *
*******************************************************************************
*/
INT8U OS_TCBInit(INT8U prio, OS_STK *ptos)
{
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr;
#endif
OS_TCB *ptcb;
OS_ENTER_CRITICAL();
ptcb = OSTCBFreeList; //得到空闲TCB
if (ptcb != (OS_TCB *)0)
{
OSTCBFreeList = ptcb->OSTCBNext; //刷新空闲TCB清单指针
OS_EXIT_CRITICAL();
ptcb->OSTCBStkPtr = ptos; //设置堆栈指针
ptcb->OSTCBPrio = prio; //设置任务优先级
ptcb->OSTCBStat = OS_STAT_RDY; //设置任务到就绪状态
ptcb->OSTCBDly = 0; //设置任务没有延时
#if OS_TASK_DEL_EN > 0
ptcb->OSTCBDelReq = OS_NO_ERR;
#endif
ptcb->OSTCBY = (INT8U)(prio >> 3);
ptcb->OSTCBBitY = OSMapTbl[ptcb->OSTCBY];
ptcb->OSTCBX = (INT8U)(prio & 0x07);
ptcb->OSTCBBitX = OSMapTbl[ptcb->OSTCBX];
OS_ENTER_CRITICAL();
OSTCBPrioTbl[prio] = ptcb;
ptcb->OSTCBNext = OSTCBList; //连接到TCB连表
ptcb->OSTCBPrev = (OS_TCB *)0;
if(OSTCBList != (OS_TCB *)0) //如果TCB当前连表不为空,则往前连接连表
{
OSTCBList->OSTCBPrev = ptcb;
}
OSTCBList = ptcb; //更新当前连表
OSRdyGrp |= ptcb->OSTCBBitY; //更新就绪组
OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX; //更新就绪表
OS_EXIT_CRITICAL();
return (OS_NO_ERR);
}
OS_EXIT_CRITICAL();
return (OS_NO_MORE_TCB);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -