int32_t LLMJVM_IMPL_scheduleRequest(int64_t absoluteTime){ int64_t relativeTime; int64_t relativeTick;//number of ticks before absoluteTime //First check if absolute time is lower than current schedule time if(absoluteTime < LLMJVM_RTX_nextWakeupTime){ if(LLMJVM_RTX_currentTimerID != NULL) os_tmr_kill(LLMJVM_RTX_currentTimerID);//kill potential previously scheduled timer LLMJVM_RTX_nextWakeupTime = absoluteTime; relativeTime = absoluteTime - LLMJVM_IMPL_getCurrentTime(MICROEJ_TRUE); relativeTick = LLMJVM_RTX_timeToTick(relativeTime); //number of ticks before absoluteTime //Checks if absoluteTick has already been reached if(relativeTick > 0){ if(relativeTick > UINT16_MAX) relativeTick = UINT16_MAX;//saturate relativeTick value to 16 bits LLMJVM_RTX_currentTimerID = os_tmr_create((U16)relativeTick, LLMJVM_RTX_TIMER_INFO); if(LLMJVM_RTX_currentTimerID == NULL) return LLMJVM_ERROR; else return LLMJVM_OK; } else { //absoluteTick has been reached, notify the vm now return LLMJVM_schedule(); } } return LLMJVM_OK; }
/**************************************************************************************************** * @fn ASFKillTimer * Kills the timer that was created earlier * * @param pTimer Pointer to timer control block containing the attributes of the timer to be * created. * * @return none * * @see ASFTimerStart() ***************************************************************************************************/ void _ASFKillTimer ( AsfTimer *pTimer, char *_file, int _line ) { TimerId ret; ASF_assert( pTimer != NULLP ); ret = os_tmr_kill( pTimer->timerId ); ASF_assert( ret == NULL ); pTimer->sysUse = (uint32_t)-1; //Timer no longer in use }