예제 #1
0
/*!
*タイマ割り込みハンドラ
*/
void tmrdriver_intr(void)
{
	static int outp = 0;
	CYCCB *cycb = (CYCCB *)mg_timerque.tmrhead->rqobjp; /* 周期タイマ以外の場合は0となる */
	TMRCB *tbf;
	
	/* 差分のキューによるソフトタイマ */
  if (is_check_timer_expired(mg_timerque.index)) { /* タイマは満了したか */
		DEBUG_OUTMSG("softtimer is expire 1.\n");
		DEBUG_OUTVLE(outp, 0);
		DEBUG_OUTMSG("\n");
		outp++;
    cancel_timer(mg_timerque.index); /* タイマキャンセル処理 */
		next_tmrcb_diffque(); /* 差分のキューからタイマコントロールブロックの排除 */
		
		/* 周期タイマの時はタイマブロックを作成(createを呼ぶと先頭のタイマがかけられてしまうので排除してから呼ぶ) */
    if (cycb) {
    	tbf = (TMRCB *)create_tmrcb_diffque(OTHER_MAKE_TIMER, cycb->cyctim, (TMRRQ_OBJP)cycb, cycb->func, cycb->exinf); /* 差分のキューのノードを作成 */
    	cycb->tobjp = (TMR_OBJP)tbf;
    }
  }
	/* ハードタイマ */
	if (is_check_timer_expired(HARD_TIMER_DEFAULT_DEVICE)) { /* タイマは満了したか */
		DEBUG_OUTMSG("hardtimer id expire 0.\n");
		expire_timer(HARD_TIMER_DEFAULT_DEVICE); /* タイマ満了処理 */
	}
}
예제 #2
0
/**
 * @brief  RTC Application runs in while loop
 * @param  None
 * @retval : None
 */
void alarm_Mgmt(void)
{
	static uint32_t Dummy;

	if ( s_AlarmDateStructVar.mode)
	{
		check_alarm();

		if( AlarmStatus  == RTC_ALARM_STARTED){
			Dummy = tick_1khz();
			AlarmStatus |= RTC_ALARM_PENDING;
			DEBUGF("Start ALARM Process.\n");
		}
		else if( (AlarmStatus & RTC_ALARM_PENDING) ){
			if( expire_timer( Dummy, 4000) ){
				DEBUGF("Stop ALARM Process.\n");
				AlarmStatus = RTC_ALARM_WAITING;
				if (s_AlarmDateStructVar.mode == ALARM_MODE_ONCE){
					WRITE_BKP_ALARM_MODE(ALARM_MODE_DISABLE);
					s_AlarmDateStructVar.mode = ALARM_MODE_DISABLE;
				}
			}
		}
	}
}
예제 #3
0
/*!
*タイマキャンセルする関数
*index : タイマ資源番号
*/
void cancel_timer(int index)
{
  volatile struct h8_3069f_tmr *tmr = regs[index].tmr;

  expire_timer(index); /* タイマ満了処理 */

  tmr->tcr0 = 0;
  tmr->tcr1 = 0;

	/* タイマ割込み無効化.TCR(タイマコントロールレジスタ)のCMIEA(コンペアマッチインタラプトイネーブル)ビットを落とす */
  tmr->tcr0 &= ~H8_3069F_TMR_TCR_CMIEA;
}
예제 #4
0
/**
 * @brief Used by CARIBOU to process timers during the main thread idle loop.
 * @return number of timers expired
 */
int caribou_timer_idle(caribou_thread_t* thread)
{
	int rc;
	int delta_jiffies;
	int state = chip_systick_irq_disable();
	delta_jiffies=(caribou_state.jiffies-caribou_state.tail_jiffies);
	if ( delta_jiffies )
	{
        caribou_state.tail_jiffies = caribou_state.jiffies;
        while(thread)
        {
            /** expire timers...*/
            for(caribou_timer_t* timer=thread->timer; timer!=NULL; timer = timer->next)
            {
                rc += expire_timer(thread,timer,delta_jiffies);
            }
			thread = thread->next;
        }
	}
	chip_systick_irq_set(state);
	return rc;
}