/*! * \brief Adds the lightweight timer to the periodic queue. * * The function inserts the timer in the queue in order of increasing offset * from the queue's start time. * * \param[in] period_ptr Pointer to the periodic queue. * \param[in] timer_ptr Pointer to the lightweight timer to add to the queue, * must be smaller than queue. * \param[in] ticks Tick offset from the timers period to expire at. * \param[in] func Function to call when the timer expires. * \param[in] parameter Parameter to pass to the function. * * \return MQX_OK * \return MQX_LWTIMER_INVALID (Period_ptr points to an invalid periodic queue.) * \return MQX_INVALID_PARAMETER (Ticks is greater than or equal to the * periodic queue's period.) * * \warning Disables and enables interrupts. * * \see _lwtimer_cancel_period * \see _lwtimer_cancel_timer * \see _lwtimer_create_periodic_queue * \see LWTIMER_PERIOD_STRUCT * \see LWTIMER_STRUCT */ _mqx_uint _lwtimer_add_timer_to_queue ( LWTIMER_PERIOD_STRUCT_PTR period_ptr, LWTIMER_STRUCT_PTR timer_ptr, _mqx_uint ticks, LWTIMER_ISR_FPTR func, pointer parameter ) { /* Body */ KERNEL_DATA_STRUCT_PTR kernel_data; LWTIMER_STRUCT_PTR qe_ptr; _mqx_uint i; _GET_KERNEL_DATA(kernel_data); _KLOGE4(KLOG_lwtimer_add_timer_to_queue, period_ptr, timer_ptr, ticks); #if MQX_CHECK_ERRORS if (period_ptr->VALID != LWTIMER_VALID) { _KLOGX2(KLOG_lwtimer_add_timer_to_queue, MQX_LWTIMER_INVALID); return (MQX_LWTIMER_INVALID); } /* Endif */ if (ticks >= period_ptr->PERIOD) { _KLOGX2(KLOG_lwtimer_add_timer_to_queue, MQX_INVALID_PARAMETER); return (MQX_INVALID_PARAMETER); } /* Endif */ #endif timer_ptr->TIMER_FUNCTION = func; timer_ptr->PARAMETER = parameter; timer_ptr->PERIOD_PTR = period_ptr; timer_ptr->RELATIVE_TICKS = ticks; _int_disable(); /* Insert into queue in order of increasing offset from start time */ qe_ptr = (pointer) &period_ptr->TIMERS.NEXT; i = _QUEUE_GET_SIZE(&period_ptr->TIMERS) + 1; while (--i) { qe_ptr = (pointer) qe_ptr->LINK.NEXT; if (qe_ptr->RELATIVE_TICKS >= ticks) { qe_ptr = (pointer) qe_ptr->LINK.PREV; break; } /* Endif */ } /* Endwhile */ timer_ptr->VALID = LWTIMER_VALID; _QUEUE_INSERT(&period_ptr->TIMERS, qe_ptr, &timer_ptr->LINK); _int_enable(); _KLOGX2(KLOG_lwtimer_add_timer_to_queue, MQX_OK); return (MQX_OK); } /* Endbody */
void _time_delay_internal ( /* [IN] the task to delay */ register TD_STRUCT_PTR td_ptr ) { /* Body */ register KERNEL_DATA_STRUCT_PTR kernel_data; register TD_STRUCT_PTR td2_ptr; register TD_STRUCT_PTR tdprev_ptr; register _mqx_uint count; register _mqx_int result; _GET_KERNEL_DATA(kernel_data); /* Remove task from ready to run queue */ tdprev_ptr = (TD_STRUCT_PTR)((pointer)&kernel_data->TIMEOUT_QUEUE); if ( _QUEUE_GET_SIZE(&kernel_data->TIMEOUT_QUEUE) ) { /* Perform insertion sort by time */ td2_ptr = (TD_STRUCT_PTR)((pointer)kernel_data->TIMEOUT_QUEUE.NEXT); /* SPR P171-0023-01 use pre-decrement on while loop */ count = _QUEUE_GET_SIZE(&kernel_data->TIMEOUT_QUEUE) + 1; while ( --count ) { /* END SPR */ result = PSP_CMP_TICKS(&td2_ptr->TIMEOUT, &td_ptr->TIMEOUT); if (MQX_DELAY_ENQUEUE_POLICY(result)) { /* CR171 */ /* Enqueue before td2_ptr */ break; } /* Endif */ tdprev_ptr = td2_ptr; td2_ptr = td2_ptr->TD_NEXT; } /* Endwhile */ } /* Endif */ /* Remove from ready queue */ _QUEUE_UNLINK(td_ptr); /* Insert into timeout queue */ _QUEUE_INSERT(&kernel_data->TIMEOUT_QUEUE,tdprev_ptr,td_ptr); td_ptr->STATE |= IS_ON_TIMEOUT_Q; _sched_execute_scheduler_internal(); } /* Endbody */