📄 tmc.c
字号:
/* Start the specified timer. */ TMC_Start_Timer(timer, time);}/*************************************************************************//* *//* FUNCTION *//* *//* TMC_Stop_Task_Timer *//* *//* DESCRIPTION *//* *//* This function is responsible for stopping a task timer. Note *//* that there are some special protection considerations since *//* this function is called from the task control component. This *//* routine must be called from Supervisor mode in a Supervisor/User *//* mode switching kernel. *//* *//* CALLED BY *//* *//* TCC_Resume_Task Resume task function *//* TCC_Terminate_Task Terminate task function *//* *//* CALLS *//* *//* TMC_Stop_Timer Stop the timer *//* *//* INPUTS *//* *//* timer Timer control block pointer *//* *//* OUTPUTS *//* *//* None *//* *//* HISTORY *//* *//* DATE REMARKS *//* *//* 03-01-1993 Created initial version 1.0 *//* 04-19-1993 Verified version 1.0 *//* 03-01-1994 Removed protection logic since *//* system protect is in force at *//* the time this function is *//* called, resulting in *//* version 1.1 *//* *//* 03-18-1994 Verified version 1.1 *//* *//*************************************************************************/VOID TMC_Stop_Task_Timer(TM_TCB *timer){ /* Stop the specified timer - if it is still active. */ if (timer -> tm_next_timer) TMC_Stop_Timer(timer);}/*************************************************************************//* *//* FUNCTION *//* *//* TMC_Start_Timer *//* *//* DESCRIPTION *//* *//* This function is responsible for starting both application and *//* task timers. This routine must be called from Supervisor mode *//* in a Supervisor/User mode switching kernel. *//* *//* CALLED BY *//* *//* TMC_Control_Timer Control application timer *//* TMC_Start_Task_Timer Start task timer *//* *//* CALLS *//* *//* TMT_Read_Timer Read current timer counter *//* TMT_Adjust_Timer Adjust the count-down timer *//* TMT_Enable_Timer Enable count-down timer *//* *//* INPUTS *//* *//* timer Timer control block pointer *//* time Time associated with timer *//* *//* OUTPUTS *//* *//* None *//* *//* HISTORY *//* *//* DATE REMARKS *//* *//* 03-01-1993 Created initial version 1.0 *//* 04-19-1993 Verified version 1.0 *//* 08-09-1993 Added logic to check for timer *//* expiration before or during *//* another LISR's access, *//* resulting in version 1.0a *//* 08-09-1993 Verified version 1.0a *//* 03-01-1994 Removed disable timer logic to *//* insure there is no timer loss, *//* added register logic, *//* resulting in version 1.1 *//* *//* 03-18-1994 Verified version 1.1 *//* *//*************************************************************************/VOID TMC_Start_Timer(TM_TCB *timer, UNSIGNED time){R1 TM_TCB *list_ptr; /* Working pointer timer ptr */UNSIGNED elapsed; /* Elapsed time variable */INT done; /* Search finished flag */ /* Note that protection over the active timer list is in force when this function is called. */ /* Determine if the active list is empty. */ if (TMD_Active_Timers_List == NU_NULL) { /* Place the timer on an empty list. */ timer -> tm_next_timer = timer; timer -> tm_previous_timer = timer; /* Link the timer to the list head. */ TMD_Active_Timers_List = timer; /* Setup the actual count-down timer structures. */ TMD_Timer_Start = time; timer -> tm_remaining_time = time; /* BUG FIX FOR NU_RESET WITH INITIAL TIME OF 0 */ /* Determine if there is any time remaining on the timer. If so, enable the timer. Otherwise, the Timer HISR is already pending, so skip starting the timer again. */ if (time != 0) /* Start the actual count-down timer. */ TMT_Enable_Timer(TMD_Timer_Start); else TMD_Timer_State = TM_EXPIRED; } else { /* Place the new timer into the list. */ /* Pickup the head of the list. */ list_ptr = TMD_Active_Timers_List; /* Determine if the timer is being added while the timer expiration task is running. If so, don't attempt to adjust the expiration list. If not, adjust the list. */ if (!TMD_Active_List_Busy) { /* Calculate the elapsed amount of time from the last timer request. */ elapsed = TMD_Timer_Start - TMT_Read_Timer(); /* Adjust the first entry in the timer list and the timer start value accordingly. */ TMD_Timer_Start = TMD_Timer_Start - elapsed; /* Make sure the remaining time is never below zero. */ if (list_ptr -> tm_remaining_time > elapsed) { list_ptr -> tm_remaining_time = list_ptr -> tm_remaining_time - elapsed; } else { list_ptr -> tm_remaining_time = 0; } } /* At this point the timer list is accurate again. Find the appropriate place on the timer list for the new timer. */ /* Determine where to place the timer in the list. */ done = NU_FALSE; do { /* Determine if the timer belongs before the current timer pointed to by list_ptr. */ if (time < list_ptr -> tm_remaining_time) { /* Update the time of the next timer. */ list_ptr -> tm_remaining_time = list_ptr -> tm_remaining_time - time; /* Determine if an insertion at the head of the list is present. */ if (list_ptr == TMD_Active_Timers_List) /* Move the list head to the new timer. */ TMD_Active_Timers_List = timer; /* Set the done flag to end the search. */ done = NU_TRUE; } else { /* Decrement the time by the remaining value of each timer in the list. In this way, the list never has to be searched again. */ time = time - list_ptr -> tm_remaining_time; /* Move the list pointer to the next timer in the list. */ list_ptr = list_ptr -> tm_next_timer; /* Check to see if the list has wrapped around. */ if (list_ptr == TMD_Active_Timers_List) /* Searching is done. */ done = NU_TRUE; } } while (!done); /* Link the new timer into the list. */ timer -> tm_next_timer = list_ptr; timer -> tm_previous_timer = list_ptr -> tm_previous_timer;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -