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

📄 os_timer.c

📁 一个简单易用的可裁减的小型实时操作系统 移植非常简单
💻 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 + -