void TimerStart( TimerEvent_t *obj ) { uint32_t elapsedTime = 0; uint32_t remainingTime = 0; __disable_irq( ); if( ( obj == NULL ) || ( TimerExists( obj ) == true ) ) { __enable_irq( ); return; } obj->Timestamp = obj->ReloadValue; obj->IsRunning = false; if( TimerListHead == NULL ) { TimerInsertNewHeadTimer( obj, obj->Timestamp ); } else { if( TimerListHead->IsRunning == true ) { elapsedTime = TimerGetValue( ); if( elapsedTime > TimerListHead->Timestamp ) { elapsedTime = TimerListHead->Timestamp; // security but should never occur } remainingTime = TimerListHead->Timestamp - elapsedTime; } else { remainingTime = TimerListHead->Timestamp; } if( obj->Timestamp < remainingTime ) { TimerInsertNewHeadTimer( obj, remainingTime ); } else { TimerInsertTimer( obj, remainingTime ); } } __enable_irq( ); }
void TimerStart( TimerEvent_t *obj ) { uint32_t elapsedTime = 0; BACKUP_PRIMASK(); DISABLE_IRQ( ); if( ( obj == NULL ) || ( TimerExists( obj ) == true ) ) { RESTORE_PRIMASK( ); return; } obj->Timestamp = obj->ReloadValue; obj->IsRunning = false; if( TimerListHead == NULL ) { HW_RTC_SetTimerContext( ); TimerInsertNewHeadTimer( obj ); // insert a timeout at now+obj->Timestamp } else { elapsedTime = HW_RTC_GetTimerElapsedTime( ); obj->Timestamp += elapsedTime; if( obj->Timestamp < TimerListHead->Timestamp ) { TimerInsertNewHeadTimer( obj); } else { TimerInsertTimer( obj); } } RESTORE_PRIMASK( ); }