📄 time.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 + -