?? tcc.c
字號:
/* Switch to supervisor mode */
NU_SUPERVISOR_MODE();
/* Move input HISR pointer into internal pointer. */
hisr = (TC_HCB *) hisr_ptr;
#ifdef NU_ENABLE_STACK_CHECK
/* Call stack checking function to check for an overflow condition. */
TCT_Check_Stack();
#endif
#ifdef NU_ENABLE_HISTORY
/* Make an entry that corresponds to this function in the system history
log. */
HIC_Make_History_Entry(NU_DELETE_HISR_ID, (UNSIGNED) hisr,
(UNSIGNED) 0, (UNSIGNED) 0);
#endif
/* Protect the list of created HISRs. */
TCT_Protect(&TCD_HISR_Protect);
#ifdef INCLUDE_PROVIEW
_RTProf_DumpHisr(hisr,RT_PROF_DELETE_HISR);
#endif /*INCLUDE_PROVIEW*/
/* Remove the HISR from the list of created HISRs. */
CSC_Remove_From_List(&TCD_Created_HISRs_List, &(hisr -> tc_created));
/* Decrement the total number of created HISRs. */
TCD_Total_HISRs--;
/* Clear the HISR ID just in case. */
hisr -> tc_id = 0;
/* Release protection. */
TCT_Unprotect();
/* Return to user mode */
NU_USER_MODE();
/* Return a successful completion. */
return(NU_SUCCESS);
}
/*************************************************************************/
/* */
/* FUNCTION */
/* */
/* TCC_Reset_Task */
/* */
/* DESCRIPTION */
/* */
/* This function resets the specified task. Note that a task reset */
/* can only be performed on tasks in a finished or terminated state.*/
/* The task is left in an unconditional suspended state. */
/* */
/* CALLED BY */
/* */
/* Application */
/* TCCE_Reset_Task Error checking shell */
/* */
/* CALLS */
/* */
/* [HIC_Make_History_Entry] Make entry in history log */
/* TCT_Build_Task_Stack Build an initial task stack */
/* [TCT_Check_Stack] Stack checking function */
/* TCT_Protect Protect created task list */
/* TCT_Unprotect Release protection of list */
/* */
/* INPUTS */
/* */
/* task_ptr Task control block pointer */
/* argc Optional task parameter */
/* argv Optional task parameter */
/* */
/* OUTPUTS */
/* */
/* NU_SUCCESS Indicates successful request */
/* NU_NOT_TERMINATED Indicates task was not */
/* finished or terminated */
/* */
/* HISTORY */
/* */
/* DATE REMARKS */
/* */
/* 03-01-1993 Created initial version 1.0 */
/* 04-19-1993 Verified version 1.0 */
/* 03-01-1994 Modified function interface, */
/* added register optimizations, */
/* added system protection logic, */
/* resulting in version 1.1 */
/* */
/* 03-18-1994 Verified version 1.1 */
/* */
/*************************************************************************/
STATUS TCC_Reset_Task(NU_TASK *task_ptr, UNSIGNED argc, VOID *argv)
{
R1 TC_TCB *task; /* Task control block ptr */
STATUS status; /* Status of the request */
NU_SUPERV_USER_VARIABLES
/* Switch to supervisor mode */
NU_SUPERVISOR_MODE();
/* Move input task pointer into internal pointer. */
task = (TC_TCB *) task_ptr;
#ifdef NU_ENABLE_STACK_CHECK
/* Call stack checking function to check for an overflow condition. */
TCT_Check_Stack();
#endif
#ifdef NU_ENABLE_HISTORY
/* Make an entry that corresponds to this function in the system history
log. */
HIC_Make_History_Entry(NU_RESET_TASK_ID, (UNSIGNED) task,
(UNSIGNED) argc, (UNSIGNED) argv);
#endif
/* Protect system structures. */
TCT_Protect(&TCD_System_Protect);
/* Determine if the task is in the proper state. */
if ((task -> tc_status == NU_FINISHED) ||
(task -> tc_status == NU_TERMINATED))
{
/* Yes, a valid reset is present. Indicate this in the status. */
status = NU_SUCCESS;
/* Fill in the new argument information and reset some of the other
fields. */
task -> tc_argc = argc;
task -> tc_argv = argv;
task -> tc_status = NU_PURE_SUSPEND;
task -> tc_delayed_suspend = NU_FALSE;
task -> tc_scheduled = 0;
task -> tc_stack_minimum = task -> tc_stack_size;
#if (NU_SUPERV_USER_MODE == 1)
/* Since we are doing a complete reset we need to ensure
that this field is 0 since the task will be started in
user mode. TCC_Task_Shell can not return and therefore
left the task in supervisor mode when the task completed.
If we were to not re-initialize this field the task would
become locked in user mode and API would fail. */
task -> tc_su_mode = 0;
#endif
/* Build a stack frame for this task by calling
TCT_Build_Task_Stack. */
TCT_Build_Task_Stack(task);
}
else
/* The requested task is not in a finished or terminated state. */
status = NU_NOT_TERMINATED;
#ifdef INCLUDE_PROVIEW
_RTProf_DumpTask(task,RT_PROF_RESET_TASK);
#endif /*INCLUDE_PROVIEW*/
/* Release the protection. */
TCT_Unprotect();
/* Return to user mode */
NU_USER_MODE();
/* Return completion status. */
return(status);
}
/*************************************************************************/
/* */
/* FUNCTION */
/* */
/* TCC_Terminate_Task */
/* */
/* DESCRIPTION */
/* */
/* This function terminates the specified task. If the task is */
/* already terminated, this function does nothing. If the task */
/* to terminate is currently suspended, the specified cleanup */
/* routine is also invoked to cleanup suspension data structures. */
/* */
/* CALLED BY */
/* */
/* Application */
/* TCCE_Terminate_Task Error checking shell */
/* */
/* CALLS */
/* */
/* Cleanup routine Task's suspend cleanup funct */
/* [HIC_Make_History_Entry] Make entry in history log */
/* TCC_Suspend_Task Suspend a ready task */
/* [TCT_Check_Stack] Stack checking function */
/* TCT_Protect Protect created task list */
/* TCT_Unprotect Release protection of list */
/* TCT_Unprotect_Specific Specific unprotection */
/* TMC_Stop_Task_Timer Stop a task timer */
/* */
/* INPUTS */
/* */
/* task_ptr Task control block pointer */
/* */
/* OUTPUTS */
/* */
/* NU_SUCCESS */
/* */
/* HISTORY */
/* */
/* DATE REMARKS */
/* */
/* 03-01-1993 Created initial version 1.0 */
/* 04-19-1993 Verified version 1.0 */
/* 03-01-1994 Modified function interface, */
/* added register optimizations, */
/* added system protection logic, */
/* resulting in version 1.1 */
/* */
/* 03-18-1994 Verified version 1.1 */
/* */
/*************************************************************************/
STATUS TCC_Terminate_Task(NU_TASK *task_ptr)
{
R1 TC_TCB *task; /* Task control block ptr */
TC_PROTECT *suspend_protect; /* Suspension protection ptr */
DATA_ELEMENT status; /* Task status */
NU_SUPERV_USER_VARIABLES
/* Switch to supervisor mode */
NU_SUPERVISOR_MODE();
/* Move task pointer into internal pointer. */
task = (TC_TCB *) task_ptr;
#ifdef NU_ENABLE_STACK_CHECK
/* Call stack checking function to check for an overflow condition. */
TCT_Check_Stack();
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -