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

📄 jwl-gtf_timer.c

📁 基于arm核的RTOS
💻 C
📖 第 1 页 / 共 2 页
字号:
* 返回:RateInfo		:参看JWL-GTF_error.h								*
*********************************************************************************************************/
jwl_gtf_u8 jwl_gtf_AddTimer(jwl_gtf_void (*jwl_gtf_fun)(jwl_gtf_void *),jwl_gtf_void *jwl_gtf_Param,\
     jwl_gtf_u32 TimeOut,jwl_gtf_u8 *jwl_gtf_TimerID,jwl_gtf_Timer *jwl_gtf_Timer,jwl_gtf_bool jwl_gtf_Status)
{
	jwl_gtf_Timer *tmpTimer;
	jwl_gtf_Timer *oldTimer;
	if(jwl_gtf_TimerFree==jwl_gtf_NULL||jwl_gtf_UseableCount==0)			/*定时器资源是否可用*/
		return jwl_gtf_NoTimer;							/*没有可用定时器*/
	tmpTimer=jwl_gtf_TimerFree;
	jwl_gtf_TimerFree=jwl_gtf_TimerFree->jwl_gtf_TLink->Next;			/*调整空链表指针*/
	jwl_gtf_TimerFree->jwl_gtf_Link->Pre=jwl_gtf_TimerFree;
	jwl_gtf_UseableCount--;								/*可用数递减*/
	tmpTimer->jwl_gtf_TimeOut=jwl_gtf_TimeOut;					/*定时时间,单位是滴答次*/
	tmpTimer->jwl_gtf_InitCounter=jwl_gtf_TimeOut;
	tmpTimer->jwl_gtf_TimerID=jwl_gtf_TimerID++;					/*定时器ID号*/
	tmpTimer->jwl_gtf_fun=(*jwl_gtf_fun)();						/*入口函数*/
	tmpTimer->jwl_gtf_Param=jwl_gtf_Param;						/*入口参数*/
	jwl_gtf_TimerID=tmpTimer->jwl_gtf_TimerID;
	if(jwl_gtf_Status==jwl_gtf_TimerContinue)
		tmpTimer->jwl_gtf_Status=jwl_gtf_TimerContinue;
	else if(jwl_gtf_Status==jwl_gtf_TimerKill)
		tmpTimer->jwl_gtf_Status=jwl_gtf_TimerKill;
	tmpTimer->jwl_gtf_InitCounter=TimeOut;
	if(jwl_gtf_Useable==jwl_gtf_NULL)						/*链表表头部*/
		jwl_gtf_InserTimerHead(jwl_gtf_Useable,tmpTimer);
	else
	{
		oldTimer=jwl_gtf_Useable;
		if(jwl_gtf_TimerRunmethod==jwl_gtf_TimerFIFO)
			for(;oldTimer->jwl_gtf_TimeOut<=TimeOut&&oldTimer!=jwl_gtf_NULL;\
			   oldTimer->jwl_gtf_Link->Next)
		else
			for(;oldTimer->jwl_gtf_TimeOut<TimeOut&&oldTimer!=jwl_gtf_NULL;\
			   oldTimer->jwl_gtf_Link->Next)
		jwl_gtf_InserTimerTail(oldTimer->jwl_gtf_Link->Pre,tmpTimer);
	}
	return jwl_gtf_Noerror;
}

/********************************************************************************************************
*                                        jwl_gtf_FindTimer						*
* 描述:查找定时器											*
* 参数:	TimerID :给定的时间ID号										*
* 返回:jwl_gtf_Timer   :系统返回的时间定时器指针							*
*********************************************************************************************************/
jwl_gtf_Timer *jwl_gtf_FindTimer(jwl_gtf_u8 TimerID)
{
	jwl_gtf_Timer *tmpTimer;
	tmpTimer=jwl_gtf_Useable;
	for(;tmpTimer->jwl_gtf_Timer=TimerID&&tmpTimer!=jwl_gtf_NULL;\
		tmpTimer=tmpTimer->jwl_gtf_Link->Pre)
	return tmpTimer;
}

/********************************************************************************************************
*                                        jwl_gtf_DeleteTimerHead					*
* 描述:系统定时器删除链表头										*
*参数:		a:要被删除的链表头									*
* 返回:		 :jwl_gtf_void										*
*********************************************************************************************************/
_jwl_gtf_BuildDeleteLinkHead(Timer,jwl_gtf_Timer)

/********************************************************************************************************
*                                        jwl_gtf_DeleteTimerTail					*
* 描述:系统定时器删除链表尾										*
*参数:		a:要被删除的链表尾									*
* 返回:		 :jwl_gtf_void										*
*********************************************************************************************************/
_jwl_gtf_BuildDeleteLinkTail(Timer,jwl_gtf_Timer)

/********************************************************************************************************
*                                        jwl_gtf_DelTimer						*
* 描述:取消定时器											*
* 参数:	jwl_gtf_TimerID :给定的时间ID号									*
*       jwl_gtf_Timer   :给定的时间定时器指针								*
* 返回:			:参看JWL-GTF_error.h								*
*********************************************************************************************************/
jwl_gtf_u8 jwl_gtf_delTimer(jwl_gtf_Timer *Timer,jwl_gtf_u8 TimerID)
{
	jwl_gtf_Timer *tmpTimer;
	if(jwl_gtf_Timer==jwl_gtf_NULL)							/*是否用ID查找*/
	{
		if(tmpTimer=jwl_gtf_FindTimer(jwl_gtf_Timer)!=jwl_gtf_Noerror)
			return jwl_gtf_NoTimerID;					/*ID不存在*/
	}
	if(tmpTimer->jwl_gtf_Link->pre==jwl_gtf_Useable)				
		jwl_gtf_DeleteTimerHead(jwl_gtf_Useable);
	else
		jwl_gtf_DeleteTimerTail(tmpTimer);
	jwl_gtf_InserTimerHead(jwl_gtf_TimerFree,tmpTimer);
	jwl_gtf_UseableCount++;
	return jwl_gtf_Noerror;
}

/********************************************************************************************************
*                                        jwl_gtf_SetTimerInfo						*
* 描述:取消定时器											*
* 参数:	TimerID 	:给定的时间ID号									*
*       Timer   	:给定的时间定时器指针								*
*       TimerInfo	:定时器设定信息									*
* 返回:			:参看JWL-GTF_error.h								*
*********************************************************************************************************/
jwl_gtf_s8 jwl_gtf_SetTimerInfo(jwl_gtf_Timer *Timer,jwl_gtf_u8 TimerID,jwl_gtf_TimerInfo *TimerInfo)
{
	jwl_gtf_Timer *tmpTimer;
	jwl_gtf_Timer *oldTimer;
	if(TimerInfo->jwl_gtf_TimeOut<0)||(TimerInfo->jwl_gtf_Status<0&&\
	    TimerInfo->jwl_gtf_Status>1))
	 	return jwl_gtf_ParaError;						/*参数无效*/
	if(Timer==jwl_gtf_NULL)
	{
		if(tmpTimer=jwl_gtf_FindTimer(TimerID)==jwl_gtf_NULL)			/*时间ID号不存在*/
			return jwl_gtf_FindTimer;
	}
	else
		tmpTimer=Timer;
	if(TimerInfo->jwl_gtf_TimeOut==tmpTimer->jwl_gtf_TimeOut)
		tmpTimer->jwl_gtf_Status=TimerInfo->jwl_gtf_Status;
	else
	{
		if(tmpTimer->jwl_gtf_Link->Pre==jwl_gtf_Useable)
			jwl_gtf_DeleteTimerHead(jwl_gtf_Useable);
		else
			jwl_gtf_DeleteTimerHead(tmpTimer);
		tmpTimer->jwl_gtf_TimeOut=TimerInfo->jwl_gtf_TimeOut;
		tmpTimer->jwl_gtf_InitCounter=TimerInfo->jwl_gtf_TimeOut;
		tmpTimer->jwl_gtf_Status=TimerInfo->jwl_gtf_Stauts;
		oldTimer=jwl_gtf_Useable;
		if(jwl_gtf_TimerRunmethod==jwl_gtf_TimerFIFO)
			for(;oldTimer->jwl_gtf_TimeOut<=TimeOut&&oldTimer!=jwl_gtf_NULL;\
			   oldTimer->jwl_gtf_Link->Next)
		else
			for(;oldTimer->jwl_gtf_TimeOut<TimeOut&&oldTimer!=jwl_gtf_NULL;\
			   oldTimer->jwl_gtf_Link->Next)
		jwl_gtf_InserTimerTail(oldTimer->jwl_gtf_Link->Pre,tmpTimer);				
	}
	return jwl_gtf_Noerror;
}

/********************************************************************************************************
*                                        jwl_gtf_GetTimerInfo						*
* 描述:获得指定定时器相关信息											*
* 参数:	TimerID 	:给定的时间ID号									*
*       Timer   	:给定的时间定时器指针								*
* 返回:			:jwl_gtf_TimerInfo								*
*********************************************************************************************************/
jwl_gtf_Info *jwl_gtf_GetTimerInfo(jwl_gtf_Timer *Timer,jwl_gtf_u8 TimerID)
{
	jwl_gtf_Timer *tmpTimer;
	jwl_gtf_Info *tmpInfo;
	if(Timer==jwl_gtf_NULL)
	{
		if(tmpTimer=jwl_gtf_FindTimer(TimerID)==jwl_gtf_NULL)			/*时间ID号不存在*/
			return jwl_gtf_NULL;
	}
	else
		tmpTimer=Timer;
	tmpInfo->jwl_gtf_TimeOut=tmpTimer->jwl_gtf_InitCounter;
	tmpInfo->jwl_gtf_InitCounter=tmpTimer->jwl_gtf_InitCounter;
	tmpInfo->jwl_gtf_Stauts=tmpTimer->jwl_gtf_Status;
	return tmpInfo;
}

/********************************************************************************************************
*                                        jwl_gtf_RunTimerList						*
* 描述:执行定时任务											*
* 参数:													*
* 返回:			:参看JWL-GTF_error.h								*
*********************************************************************************************************/
jwl_gtf_void jwl_gtf_RunTimerList()
{
	jwl_gtf_Timer *tmpTimer;
	jf(jwl_gtf_Timer==jwl_gtf_NULL)
		return;
	tmpTimer=jwl_gtf_Useable;
	for(;tmpTimer!=jwl_gtf_NULL;tmpTimer->jwl_gtf_Link->Next)
	{
		if(--tmpTimer->jwl_gtf_TimeOut==0)
		{
			jwl_gtf_void(*tmpTimer->jwl_gtf_fun)(tmpTimer->jwl_gtf_Param);
			if(tmpTimer->jwl_gtf_Stauts==jwl_gtf_TimerContinue)		/*任务定时完则继续定时*/
			{
				if(tmpTimer->jwl_gtf_Link->Pre==jwl_gtf_Useable)
					jwl_gtf_DeleteTimerHead(jwl_gtf_Useable);
				else
					jwl_gtf_DeleteTimerHead(tmpTimer);
				if(jwl_gtf_TimerRunmethod==jwl_gtf_TimerFIFO)
					for(;oldTimer->jwl_gtf_TimeOut<=TimeOut&&oldTimer!=jwl_gtf_NULL;\
					   oldTimer->jwl_gtf_Link->Next)
				else
					for(;oldTimer->jwl_gtf_TimeOut<TimeOut&&oldTimer!=jwl_gtf_NULL;\
					   oldTimer->jwl_gtf_Link->Next)
				jwl_gtf_InserTimerTail(oldTimer->jwl_gtf_Link->Pre,tmpTimer);
				tmpTimer->jwl_gtf_TimeOut=tmpTimer->jwl_gtf_InitCounter				
			}
			else
				jwl_gtf_delTimer(tmpTimer,0);				/*任务执行完则删除*/
		}
	}
	return;
}

/********************************************************************************************************
*                                        jwl_gtf_TimerCounter						*
* 描述:更新时钟												*
* 参数:													*
* 返回:		:参看JWL-GTF_error.h									*
*********************************************************************************************************/
jwl_gtf_void jwl_gtf_TimerCounter()
{
	jwl_gtf_u8 rMonth[3];
#if	jwl_gtf_Counter<1000000
	jwl_gtf_nSec+=jwl_gtf_Counter;
	if(jwl_gtf_nSec<1000000)
		return;
	else
	{
		jwl_gtf_nSec-=1000000;
		jwl_gtf_mSec++;
	}
#else
	jwl_gtf_mSec+=jwl_gtf_Counter/1000000;
	jwl_gtf_nSec+=jwl_gtf_Counter-(jwl_gtf_Counter/1000000)*1000000;
	if(jwl_gtf_nSec>1000000)
	{
		jwl_gtf_nSec-=1000000;
		jwl_gtf_mSec++;		
	}
#endif
	if(jwl_gtf_mSec<1000)
		return;
	jwl_gtf_mSec-=1000;
	if(++jwl_gtf_Sec<59)
		return;
	jwl_gtf_Sec-=60;
	if(++jwl_gtf_Min<59)
		return;
	jwl_gtf_Min-=60;
	if(++jwl_gtf_Hour<23)
		return;
	jwl_gtf_Hour-=24;
	if(++jwl_gtf_Day<29)
		return;
	else
	{
		if(jwl_gtf_Month!=2)	/*不是月份*/
		{
			sprintf(rMonth,"%d\n",jwl_gtf_Month);
			switch(rMonth)
			{
				case 1:
				case 3:
				case 5:
				case 7:
				case 8:
				case 10:
				case 12:
					if(jwl_gtf_Day<31)
						return;
					else
					{
						jwl_gtf_Day-=31;
					  	break;
					}
				case 4:
				case 6:
				case 9:
				case 11:
					if(jwl_gtf_Day<30)
						return;
					else
					{
						jwl_gtf_Day-=30;
						break;
					}
			}
		}
		else
		{
			if((jwl_gtf_Year/4)*4==jwl_gtf_Year)
			{
				if((jwl_gtf_Year/100)*100!=jwl_gtf_Year)
				{
					if(jwl_gtf_Day<29)
						return;
					else
					{
						jwl_gtf_Day-=29;
						break;
					}
				}
				else
				{
					if((jwl_gtf_Year/400)*400==jwl_gtf_Year)
					{
						if(jwl_gtf_day<29)
							return;
						else
						{
							jwl_gtf_Day-=29;
							break;
						}
					}
					else
					{
						if(jwl_gtf_Day<28)
							return;
						else
						{
							jwl_gtf_Day-=28;
							break;
						}
					}
				}
			}
			else
			{
				if(jwl_gtf_Day<29)
					return;
				else
				{
					jwl_gtf_Day-=29;
					break;
				}
			}
		}
	}
	if(++jwl_gtf_Month<12)
		return;
	jwl_gtf_Mont-=12;
	jwl_gtf_Year++;
}

⌨️ 快捷键说明

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