/*! *タイマ割り込みハンドラ */ 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); /* タイマ満了処理 */ } }
/** * @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; } } } } }
/*! *タイマキャンセルする関数 *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; }
/** * @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; }