⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sched.c

📁 Rabbit 32Bit RTOS源代码
💻 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 + -