📄 sched.c
字号:
/*********************************************************************
* Copyright (c) 2011-2012,李士伟
* All rights reserved.
*文 件 名:sched.c
*描 述:调度器源文件
*当前版本:V1.00
*作 者:李士伟
*创建日期:2011.09.29
**********************************************************************/
#include <kernel\sched.h>
#include <kernel\flag.h>
#include <kernel\kd.h>
#include <kernel\asm.h>
/*********************************************************************
*函 数 名:OS_EnterRunQ
*描 述:将一个TCB加入TCB运行队列队头
*输入参数:ptcb:TCB指针
*输出参数:无
*返 回 值:无
*注 意:
**********************************************************************/
void OS_EnterRunQ(OS_TCB *ptcb)
{
if (ptcb == NULL)
{
return ;
}
OS_ENTER_CRITICAL();
if (ptcb->QHead == &OSTCBRunQ)
{
OS_EXIT_CRITICAL();
return ;
}
/* 先从QHead所指向的队列中删除该节点 */
if (ptcb->QHead != NULL)
{
if (ptcb->QPrev == NULL)
{
*(ptcb->QHead) = ptcb->QNext;
if (*(ptcb->QHead) != NULL)
{
(*(ptcb->QHead))->QPrev = NULL;
}
}
else
{
(ptcb->QPrev)->QNext = ptcb->QNext;
}
if (ptcb->QNext != NULL)
{
(ptcb->QNext)->QPrev = ptcb->QPrev;
}
}
/* 将该节点加入TCB运行队列 */
ptcb->QHead = &OSTCBRunQ;
ptcb->QNext = OSTCBRunQ;
ptcb->QPrev = NULL;
if (OSTCBRunQ != NULL)
{
OSTCBRunQ->QPrev = ptcb;
}
OSTCBRunQ = ptcb;
ptcb->State &= ~(OS_TASK_BLOCKED);
OS_EXIT_CRITICAL();
}
/*********************************************************************
*函 数 名:OS_EnterWaitQHead
*描 述:将一个TCB加入TCB等待队列队头
*输入参数:waitq: 等待队列头指针的指针
ptcb:TCB指针
*输出参数:无
*返 回 值:无
*注 意:
**********************************************************************/
void OS_EnterWaitQHead(OS_TCB **waitq, OS_TCB *ptcb)
{
if (waitq == NULL || ptcb == NULL)
{
return ;
}
OS_ENTER_CRITICAL();
if (ptcb->QHead == waitq)
{
OS_EXIT_CRITICAL();
return ;
}
/* 先从QHead所指向的队列中删除该节点 */
if (ptcb->QHead != NULL)
{
if (ptcb->QPrev == (OS_TCB *)0)
{
*(ptcb->QHead) = ptcb->QNext;
if (*(ptcb->QHead) != NULL)
{
(*(ptcb->QHead))->QPrev = NULL;
}
}
else
{
(ptcb->QPrev)->QNext = ptcb->QNext;
}
if (ptcb->QNext != NULL)
{
(ptcb->QNext)->QPrev = ptcb->QPrev;
}
}
/* 加入waitq队列头节点 */
ptcb->QHead = waitq;
ptcb->QNext = *waitq;
ptcb->QPrev = NULL;
if (*waitq != NULL)
{
(*waitq)->QPrev = ptcb;
}
*waitq = ptcb;
ptcb->State |= OS_TASK_BLOCKED;
OS_EXIT_CRITICAL();
}
/*********************************************************************
*函 数 名:OS_EnterWaitQTail
*描 述:将一个TCB加入TCB等待队列队尾
*输入参数:waitq: 等待队列头指针的指针
ptcb:TCB指针
*输出参数:无
*返 回 值:无
*注 意:
**********************************************************************/
void OS_EnterWaitQTail(OS_TCB **waitq, OS_TCB *ptcb)
{
OS_TCB *tailtcb;
if (waitq == NULL || ptcb == NULL)
{
return ;
}
OS_ENTER_CRITICAL();
if (ptcb->QHead == waitq)
{
OS_EXIT_CRITICAL();
return ;
}
/* 先从QHead所指向的队列中删除该节点 */
if (ptcb->QHead != NULL)
{
if (ptcb->QPrev == NULL)
{
*(ptcb->QHead) = ptcb->QNext;
if (*(ptcb->QHead) != NULL)
{
(*(ptcb->QHead))->QPrev = (OS_TCB*)0;
}
}
else
{
(ptcb->QPrev)->QNext = ptcb->QNext;
}
if (ptcb->QNext != NULL)
{
(ptcb->QNext)->QPrev = ptcb->QPrev;
}
}
/* 加入waitq队列队尾 */
ptcb->QHead = waitq;
ptcb->QNext = NULL;
tailtcb = *waitq;
if(tailtcb != NULL) /* ptcb 加入的是非空队列 */
{
while (tailtcb->QNext != NULL) /* tailtcb定位到队尾 */
{
tailtcb = tailtcb->QNext;
}
ptcb->QPrev = tailtcb;
tailtcb->QNext = ptcb;
}
else /* ptcb 加入的是空队列 */
{
*waitq = ptcb;
ptcb->QPrev = NULL;
}
ptcb->State |= OS_TASK_BLOCKED;
OS_EXIT_CRITICAL();
}
/*********************************************************************
*函 数 名:OS_FindNextRunTask
*描 述:在任务就绪表中查找下一个运行任务
*输入参数:无
*输出参数:无
*返 回 值:返回最高优先级就绪任务的TCB指针
*注 意:
**********************************************************************/
OS_TCB *OS_FindNextRunTask(void)
{
INT32U prio;
OS_TCB *ptcb;
OS_TCB *Rptcb;
prio = 0;
OS_ENTER_CRITICAL();
ptcb = OSTCBRunQ;
Rptcb = ptcb;
while (ptcb != NULL)
{
if ((ptcb->State == OS_TASK_RUNNING) && (prio <= ptcb->Prio))
{
prio = ptcb->Prio;
Rptcb = ptcb;
}
ptcb = ptcb->QNext;
}
OS_EXIT_CRITICAL();
return Rptcb;
}
/*********************************************************************
*函 数 名:OS_LockSched
*描 述:锁定调度器
*输入参数:无
*输出参数:无
*返 回 值:无
*注 意:
**********************************************************************/
void OS_LockSched(void)
{
OS_ENTER_CRITICAL();
OSSchedLock++;
OS_ENTER_CRITICAL();
}
/*********************************************************************
*函 数 名:OS_UnlockSched
*描 述:解锁调度器
*输入参数:无
*输出参数:无
*返 回 值:无
*注 意:
**********************************************************************/
void OS_UnlockSched(void)
{
OS_ENTER_CRITICAL();
OSSchedLock--;
OS_ENTER_CRITICAL();
}
/*********************************************************************
*函 数 名:OS_Sched
*描 述:任务级任务调度器
*输入参数:无
*输出参数:无
*返 回 值:无
*注 意:
**********************************************************************/
void OS_Sched(void)
{
OS_ENTER_CRITICAL();
if ((OSIntNesting == 0) && (OSSchedLock == 0))
{
OSTCBHighRdy = OS_FindNextRunTask();
if (OSTCBHighRdy != OSTCBCur)
{
OS_TaskCtxSw();
}
}
OS_EXIT_CRITICAL();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -