2
« on: April 16, 2014, 04:20:59 PM »
Hi Mark,
Appreciated you reply. I am looking into this as I have stumble with a problem that causes incorrect value(rare case) being fed into function fnReduceSWTimer, causing some of the timer overflow and not fire in time.
The new version is more self explainable.
Below the the whole contents of fnStartNewTimer, please advise if the require changes involve is only as per your previous post.
static void fnStartNewTimer(TIMER_BLOCK *ptrNewTimer)
{
#ifdef GLOBAL_HARDWARE_TIMER
if (ptrNewTimer->OwnerTask & HARDWARE_TIMER) { // start a new hardware timer
fnSetNewHWTimer(ptrNewTimer); // start hardware timer or queue the new timer
return;
}
#endif
if (!fnGetNotTimer(ptrNewTimer)) { // start new mono-stable timer
uTaskerMonoTimer( OWN_TASK, (DELAY_LIMIT)ptrNewTimer->TimerDelay, E_TIMER_FIRED ); // if no other timer active, simply start ours
TimeStamp = uTaskerSystemTick;
NextFire = ptrNewTimer->TimerDelay;
}
else {
UTASK_TICK RemainingTime = TimeStamp + NextFire; // if our delay is longer than the present delay we calculate delay difference
if (RemainingTime >= uTaskerSystemTick) {
RemainingTime -= uTaskerSystemTick;
}
else {
RemainingTime = uTaskerSystemTick - RemainingTime;
}
if (RemainingTime > ptrNewTimer->TimerDelay) {
fnReduceSWTimers(ptrNewTimer, (unsigned char)(NextFire - (unsigned char)RemainingTime));
uTaskerMonoTimer( OWN_TASK, (DELAY_LIMIT)ptrNewTimer->TimerDelay, E_TIMER_FIRED );
TimeStamp = uTaskerSystemTick;
NextFire = ptrNewTimer->TimerDelay;
}
}
}
Thank you very much.