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

📄 timer.c

📁 050117 CD 修正分 iTRON hosroot
💻 C
字号:
/* ------------------------------------------------------------------------- */
/*  HOS 帪娫娗棟晹暘                                                         */
/*                                                                           */
/*                                   Copyright (C) 1998-2002 by Project HOS  */
/* ------------------------------------------------------------------------- */

#include "itron.h"


/* 24bit墘嶼儖乕僠儞 */
void __add_systim(void);	/* 僞僀儅壛嶼 */
void __add_tim(SYSTIME *pk_tim, DLYTIME *dlytim);	/* 帪娫壛嶼 */
int  __cmp_tim(SYSTIME *pk_tim1, SYSTIME *pk_tim2);	/* 帪娫斾妑 */


/* 僌儘乕僶儖曄悢 */
SYSTIME  systim;	/* 僔僗僥儉僋儘僢僋 */
T_QUE    dlyque;	/* 僞僗僋抶墑拞偺懸偪峴楍 */
UH       timint;	/* 僞僀儅儖乕僠儞偑屇偽傟傞娫妘 */


/* 僞僀儅弶婜壔 */
void __ini_tim(void)
{
	/* 僞僀儅梡僌儘乕僶儖曄悢弶婜壔 */
	timint         = 1;		/* 僨僼僅儖僩偱1ms */
	dlyque.tskcnt  = 0;
	systim.utime   = 0;
	systim.ltime   = 0;
}


/* 僞僀儅僴儞僪儔 */
void __timer_handler(void)
{
	T_TCB *tcb;
	
	/* 僇僂儞僞偺壛嶼 */
	__add_systim();
	
	/* 帪娫懸偪僞僗僋偺暅婣 */
	while ( dlyque.tskcnt > 0 ) {
		tcb = dlyque.head;
		if ( !__cmp_tim((SYSTIME *)tcb->data, &systim) )
			break;
		__set_imsk();
		__wup_dsp(tcb, E_OK);
	}
}


/* 僔僗僥儉僋儘僢僋愝掕 */
ER   set_tim(SYSTIME *pk_tim)
{
	__set_imsk();
	
	systim = *pk_tim;
	
	__res_imsk();
	
	return E_OK;
}


/* 僔僗僥儉僋儘僢僋嶲徠 */
ER   get_tim(SYSTIME *pk_tim)
{
	__set_imsk();

	*pk_tim = systim;

	__res_imsk();

	return E_OK;
}


/* 僞僗僋抶墑 */
ER   dly_tsk(DLYTIME dlytim)
{
	SYSTIME st;
	T_TCB   *tcb;
	ER      ercd;
	
#if __ERR_CHECK_LEVEL >= 3
	/* 僞僗僋撈棫晹傗僨傿僗僷僢僠嬛巭忬懺偱偼屇傋側偄 */
	if ( sysstat != TSS_TSK )
		return E_CTX;
#endif
#if __ERR_CHECK_LEVEL >= 4
	if ( dlytim < 0 )
		return E_PAR;
#endif
	
	__set_imsk();
	
	/* 懸偪忬懺偵堏峴 */
	__del_que(curtcb);
	curtcb->tskstat = TTS_WAI;
	curtcb->tskwait = TTW_DLY;
	
	/* 懸偪廔椆帪娫寁嶼 */
	st = systim;
	__add_tim(&st, &dlytim);
	curtcb->data = (VP)&st;
	
	/* 帪娫懸偪僉儏乕偵僙僢僩 */
	if ( dlyque.tskcnt == 0 ) {
		curtcb->que  = &dlyque;
		curtcb->next = curtcb;
		curtcb->prev = curtcb;
		dlyque.head  = curtcb;
		dlyque.tskcnt++;
	}
	else {
		/* 婲彴帪娫弴偵暲傋傞 */
		tcb = dlyque.head;
		for ( ; ; ) {
			tcb = tcb->prev;
			if ( __cmp_tim((SYSTIME *)(tcb->data), &st) ) {
				__ins_que(tcb, curtcb);
				break;
			}
			if ( tcb == dlyque.head ) {
				__adh_que(&dlyque, curtcb);
				break;
			}
		}
	}
	
	
	/* 僨傿僗僷僢僠 */
	ercd = __tsk_dsp();
	
	
	__res_imsk();
	
	return ercd;
}


/* 僔僗僥儉僞僀儅壛嶼 (systim += timint) */
void __add_systim(void)
{
	UW last;
	
	last = systim.ltime;
	systim.ltime += timint;
	if ( systim.ltime < last )
		systim.utime++;		/* 僉儍儕乕偺孞傝忋偘 */
}


/* 抶墑帪娫偺壛嶼  (*pk_tim += *dlytim) */
void __add_tim(SYSTIME *pk_tim, DLYTIME *dlytim)
{
	UW last;
	
	last = pk_tim->ltime;
	pk_tim->ltime += *dlytim;
	if (pk_tim->ltime < last)
		pk_tim->utime++;	/* 僉儍儕乕偺孞傝忋偘 */
}


/* 帪娫斾妑乮pk_tim1 偑 pk_time2 埲壓側傜恀乯 */
int __cmp_tim(SYSTIME *pk_tim1, SYSTIME *pk_tim2)
{
	if ( pk_tim1->utime < pk_tim2->utime )
    	return TRUE;
	if ( pk_tim1->utime > pk_tim2->utime )
		return FALSE;
	
	if ( pk_tim1->ltime <= pk_tim2->ltime )
		return TRUE;
	
	return FALSE;
}

⌨️ 快捷键说明

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