📄 os_timer.c
字号:
/*
*******************************************************************************
*
* MicroROS
*
* Copyright (C) 2007 <amwox@163.com>
*
* Description : 时间
*
* File : os_timer.c
* Author : amwox
* Edition : V0.01
* History : 2007-10-29 created
* 2008-01-28 _RemoveTimer 更改为BOOL,表示是否删除成功
*******************************************************************************
*/
#include "..\include\microROS.h"
#include "..\include\os_cpu.h"
/*
* Description : 删除一个定时器
* 此函数为内核专用函数,调用时必须关中断!!!
* Arguments : ptmr
* Returns :
*/
BOOL _RemoveTimer(pPID pTimer)
{
pPID pPrev,pTmp;
pPrev = NULL;
pTmp = os_kernel.pTimerList ;
while (pTmp != NULL) {
if (pTmp == pTimer)
break;
pPrev = pTmp;
pTmp = pTmp->pNext;
}
if (pTmp == NULL)
return FALSE;
if (pPrev != NULL)
pPrev->pNext = pTimer->pNext;
else
os_kernel.pTimerList = os_kernel.pTimerList->pNext;
if (pTimer->pNext)
pTimer->pNext->TimerCnt += pTimer->TimerCnt;
pTimer->pNext = NULL;
return TRUE;
}
/*
此函数为系统内核专用函数
将一个新的定时器插入到定时器队列中,并对定时值作必要的调整,已处于队列中的不能再次进行排队操作
*/
/*
* Description : 按时间对PID进行排队,pTimerList是一个已按时间排好队的队列.时间
* 数值低的排在最前,两个相邻的定时器,用差值表示其关系:比如,第一个
* 为30 ticks,第二个为50 ticks,那么第一个定时值为30,第二定时值为
* (50-30),依此类推.
* 此函数为内核专用函数,调用时必须关中断!!!
* Arguments : pTimer 插队的
* Returns :
*/
void _QueueTimer(pPID pTimer)
{
pPID pTmp,pPrevTmr;
pTmp = os_kernel.pTimerList;
pPrevTmr = NULL;
while (pTmp != NULL) {
if (pTimer->TimerCnt < pTmp->TimerCnt)
break;
pTimer->TimerCnt -= pTmp->TimerCnt;
pPrevTmr = pTmp;
pTmp = pTmp->pNext;
}
if (pPrevTmr != NULL) {
pTimer->pNext = pPrevTmr->pNext;
pPrevTmr->pNext = pTimer;
}
else {
pTimer->pNext = os_kernel.pTimerList;
os_kernel.pTimerList = pTimer;
}
if (pTimer->pNext)
pTimer->pNext->TimerCnt -= pTimer->TimerCnt;
}
/*
* Description :
* Arguments :
* Returns :
*/
void OS_TimeTick(void)
{
CPU_SREG cpu_sreg;
OS_ENTER_CRITICAL();
pPID pTimer = os_kernel.pTimerList;
if (pTimer != NULL) {
if (pTimer->TimerCnt) {
pTimer->TimerCnt--;
while (pTimer->TimerCnt == 0) {
os_kernel.pTimerList = os_kernel.pTimerList->pNext;
OS_TaskResume(pTimer);
pTimer = os_kernel.pTimerList;
if (pTimer == NULL)
break;
}
}
}
OS_TimeHook();
OS_EXIT_CRITICAL();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -