📄 tcc.c
字号:
#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();#endif#ifdef NU_ENABLE_HISTORY /* Make an entry that corresponds to this function in the system history log. */ HIC_Make_History_Entry(NU_TERMINATE_TASK_ID, (UNSIGNED) task, (UNSIGNED) 0, (UNSIGNED) 0);#endif /* Determine if the calling task is the current task. */ if (task == (TC_TCB *) TCD_Current_Thread) { /* Protect system data structures. */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -