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

📄 time.c

📁 Rabbit 32Bit RTOS源代码
💻 C
字号:
/*********************************************************************
*                   Copyright (c) 2011-2012,李士伟
*                     All rights reserved.
*文 件 名:timer.c
*描    述:系统时钟管理源文件
*当前版本:V1.00
*作    者:李士伟
*创建日期:2011.10.01
**********************************************************************/
#include <kernel\time.h>
#include <kernel\sched.h>
#include <kernel\task.h>
#include <kernel\flag.h>
#include <mm\memory.h>
#include <kernel\kd.h>
#include <kernel\asm.h>

/*********************************************************************
*函 数 名:OS_TimeTick
*描    述:系统时钟节拍
*输入参数:无
*输出参数:无
*返 回 值:无
*注    意:只被系统时钟中断汇编程序调用本函数  
**********************************************************************/
void OS_TimeTick(void)
{
    OS_TCB *ptcb;

    if (OSRunning == 1)
    {
        OS_DoTimerAction();  /* 执行定时器动作 */
        OS_ENTER_CRITICAL();
        OSTicks++;
        ptcb = OSTCBList;
        while (ptcb->Next != (OS_TCB*)0)
        {   
            /* --Delay 前要过滤掉OS_TASK_SUSPEND的TCB */
            if ((ptcb->Delay != 0) && ((ptcb->State & (~OS_TASK_BLOCKED))
                 == OS_TASK_RUNNING))
            {
                if (--ptcb->Delay == 0)
                {
                   /* 延时或等待事件时限到的任务进入运行队列 */
                    OS_EnterRunQ(ptcb);
                }
            }
            ptcb = ptcb->Next;
        }
        OS_EXIT_CRITICAL();
    }
}

/*********************************************************************
*函 数 名:API_TimeDly
*描    述:使任务延时若干个节拍
*输入参数:ticks 任务延时的节拍数 
*输出参数:无
*返 回 值:无
*注    意:
**********************************************************************/
void API_TimeDly(INT32U ticks)
{
    if (ticks > 0)
    {
        OS_ENTER_CRITICAL();
        OSTCBCur->State |= OS_TASK_BLOCKED;
        OSTCBCur->Delay  = ticks; 

        /* 从TCB运行队列中删除该节点 */
        if (OSTCBCur->QPrev == (OS_TCB *)0)
        {
            OSTCBRunQ = OSTCBCur->QNext;
            if (OSTCBRunQ != NULL)
            {
                OSTCBRunQ->QPrev = (OS_TCB*)0;
            }
        }
        else
        {
            (OSTCBCur->QPrev)->QNext = OSTCBCur->QNext;
        }

        if (OSTCBCur->QNext != (OS_TCB *)0) 
        {
            (OSTCBCur->QNext)->QPrev = OSTCBCur->QPrev;
        }
        OSTCBCur->QHead = NULL;
        OS_EXIT_CRITICAL();
        OS_Sched();
    }
}

/*********************************************************************
*函 数 名:API_TimeDly
*描    述:使任务延时H:M:S:MS
*输入参数:h: 时
*          m: 分
*          s: 秒
*          ms:毫秒
*输出参数:无
*返 回 值:无
*注    意:当延时给出这样0:0:0:ms的参数时,ms < 节拍周期,将不延时
**********************************************************************/
void API_TimeDlyHMSM(INT32U h, INT32U m, INT32U s, INT32U ms)
{
    /* 防止参数值超过INT32U类型表示范围,以及不符合规定的格式 */
    if (h > 1192 || m > 59 || s > 59 || ms > 999)
    {
        return ;
    }
    ms = h * 3600000 + m * 60000 + s * 1000 + ms;
    ms = ms / (1000/(OS_TICKS_PER_SECOND));
    API_TimeDly(ms);
}

/*********************************************************************
*函 数 名:API_ResumeDly
*描    述:使延时的任务继续运行
*输入参数:taskID: 任务ID 
*输出参数:无
*返 回 值:无
*注    意:
**********************************************************************/
void API_ResumeDly(INT32U taskID)
{
    OS_TCB *ptcb;

    ptcb = OS_GetTCBPtr(taskID);
    if (ptcb != NULL)
    {
        OS_ENTER_CRITICAL();
        /* 判断任务是否是调用了OS_TimeDly而被阻塞的 */
        if ((ptcb->Delay > 0) && (ptcb->QHead == NULL)
             && (ptcb->State == OS_TASK_BLOCKED))
        {
            ptcb->Delay = 0;
            OS_EXIT_CRITICAL();
            OS_EnterRunQ(ptcb);
            OS_Sched();

            return ;
        }
        OS_EXIT_CRITICAL();
    }

}

/*********************************************************************
*函 数 名:API_GetTicks
*描    述:获取系统时钟节拍数
*输入参数:无
*输出参数:无
*返 回 值:系统时钟节拍数
*注    意:
**********************************************************************/
INT32U API_GetTicks(void)
{
    return OSTicks;
}



/*********************************************************************
*函 数 名:OS_DoTimerAction
*描    述:执行定时器动作
*输入参数:无
*输出参数:无
*返 回 值:无
*注    意:
**********************************************************************/
void OS_DoTimerAction(void)
{
    OS_TIMER *timer;

    OS_ENTER_CRITICAL();
    timer = OSTimerList;
    OS_EXIT_CRITICAL();

    while (timer != NULL)
    {
         OS_ENTER_CRITICAL();
         if (timer->State == OS_TIMER_PAUSE)
         {
             timer = timer->Next;
             OS_EXIT_CRITICAL();
             continue;
         }

         if (--timer->Counter == 0)
         {
              timer->Counter = timer->Jiffies;
              OS_EXIT_CRITICAL();
             (timer->Action)();  /* 执行定时器的动作函数 */
              timer = timer->Next;
              continue;
         }
         timer = timer->Next;
         OS_EXIT_CRITICAL();

    }
}

/*********************************************************************
*函 数 名:API_AddTimer
*描    述:添加定时器
*输入参数:action:  定时动作函数指针
           jiffies: 定时间隙
*输出参数:无
*返 回 值:添加成功返回定时器指针; 添加失败返回NULL
*注    意:
**********************************************************************/
OS_TIMER *API_AddTimer(void (*action)(void), INT32U jiffies)
{
    OS_TIMER *timer;

    if ((action == NULL) || (jiffies == 0))
    {
        return NULL;
    }

    timer = (OS_TIMER *)malloc(sizeof(OS_TIMER));

    if (timer != NULL)
    {
        timer->Counter = jiffies;
        timer->Action  = action;
        timer->Jiffies = jiffies;
        timer->State   = OS_TIMER_PAUSE;
        OS_ENTER_CRITICAL();
        timer->Next = OSTimerList;
        OSTimerList = timer;
        OS_EXIT_CRITICAL();

        return timer;
    }

    return NULL;
}


/*********************************************************************
*函 数 名:API_DeleteTimer
*描    述:删除一个定时器
*输入参数:timer: 定时器指针
*输出参数:无
*返 回 值:无
*注    意:
**********************************************************************/
void API_DeleteTimer(OS_TIMER *timer)
{
    OS_TIMER *tm1, *tm2;

    OS_ENTER_CRITICAL();

    tm1 = OSTimerList;
    if (tm1 == timer)
    {
        OSTimerList = timer->Next;
        OS_EXIT_CRITICAL();
        free(timer);

        return ;
    }

    tm2 = tm1;
    tm1 = OSTimerList->Next;
    while (tm1 != NULL)
    {
        if (tm1 == timer)
        {
            tm2->Next = timer->Next;
            OS_EXIT_CRITICAL();
            free(timer);

            return ;
        }

        tm2 = tm1;
        tm1 = tm1->Next;
    }

}

/*********************************************************************
*函 数 名:API_ChangeTimerJiffies
*描    述:修改定时器的时间间隙属性
*输入参数:timer: 定时器指针
           jiffies: 时间间隙
*输出参数:无
*返 回 值:无
*注    意:
**********************************************************************/
void API_ChangeTimerJiffies(OS_TIMER *timer, INT32U jiffies)
{
    if ((timer == NULL) || (jiffies == 0))
    {
        return;
    }

    OS_ENTER_CRITICAL();
    timer->Jiffies = jiffies;
    OS_EXIT_CRITICAL();
}

/*********************************************************************
*函 数 名:API_ChangeTimerAction
*描    述:修改定时器的动作属性
*输入参数:timer: 定时器指针
           action: 动作函数指针
*输出参数:无
*返 回 值:无
*注    意:
**********************************************************************/
void API_ChangeTimerAction(OS_TIMER *timer, void (*action)(void))
{
    if ((timer == NULL) || (action == NULL))
    {
        return;
    }

    OS_ENTER_CRITICAL();
    timer->Action = action;
    OS_EXIT_CRITICAL();
}

/*********************************************************************
*函 数 名:API_StartTimer
*描    述:启动定时器
*输入参数:timer:定时器指针
*输出参数:无
*返 回 值:无
*注    意:
**********************************************************************/
void API_StartTimer(OS_TIMER *timer)
{
    timer->State = OS_TIMER_RUNNING;
}

/*********************************************************************
*函 数 名:API_PauseTimer
*描    述:暂停定时器
*输入参数:timer:定时器指针
*输出参数:无
*返 回 值:无
*注    意:
**********************************************************************/
void API_PauseTimer(OS_TIMER *timer)
{
    timer->State = OS_TIMER_PAUSE;
}

/*********************************************************************
*函 数 名:API_GetCPUUsage
*描    述:获得处理器使用率
*输入参数:无
*输出参数:无
*返 回 值:处理器使用率
*注    意:
**********************************************************************/
INT32U API_GetCPUUsage(void)
{
    return OSCPUUsage;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -