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