📄 hic.c
字号:
/* Application *//* *//* CALLS *//* *//* TCC_Current_HISR_Pointer Retrieve current HISR pointer*//* TCC_Current_Task_Pointer Retrieve current task pointer*//* TCT_Get_Current_Protect Pickup current protection *//* TCT_Protect Protect history structures *//* TCT_Set_Current_Protect Set current protection *//* TCT_Unprotect Release history protection *//* TCT_Unprotect_Specific Release history protection *//* TMT_Retrieve_Clock Retrieve system clock *//* *//* INPUTS *//* *//* param1 First history parameter *//* param2 Second history parameter *//* param3 Third history parameter *//* *//* OUTPUTS *//* *//* None *//* *//* HISTORY *//* *//* DATE REMARKS *//* *//* 03-01-1993 Created initial version 1.0 *//* 04-19-1993 Verified version 1.0 *//* 03-01-1994 Modified protection logic, *//* resulting in version 1.1 *//* *//* 03-18-1994 Verified version 1.1 *//* *//*************************************************************************/VOID HIC_Make_History_Entry(DATA_ELEMENT id, UNSIGNED param1, UNSIGNED param2, UNSIGNED param3){TC_PROTECT *save_protect; /* Save protect pointer */HI_HISTORY_ENTRY *pointer; /* Quick access pointer */NU_SUPERV_USER_VARIABLES /* Switch to supervisor mode */ NU_SUPERVISOR_MODE(); /* If we are not in initialization, get the current protection state */ if (INC_Initialize_State == INC_END_INITIALIZE) /* Pickup current protection. */ save_protect = TCT_Get_Current_Protect(); else /* we are in initialization, just clear save_protect */ save_protect = 0; /* Protect the history data structures. */ TCT_Protect(&HID_History_Protect); /* Determine if history saving is enabled. */ if (HID_History_Enable) { /* Yes, history saving is enabled. */ /* Build a pointer to the next location to write to in the table. */ pointer = &HIC_History_Table[HID_Write_Index]; /* Place the necessary information into the history table at the current location. */ pointer -> hi_id = id; pointer -> hi_param1 = param1; pointer -> hi_param2 = param2; pointer -> hi_param3 = param3; pointer -> hi_time = TMT_Retrieve_Clock(); /* Now determine what thread we are currently in. */ if ((pointer -> hi_thread = (VOID *) TCC_Current_Task_Pointer()) != NU_NULL) /* Task thread. Set the caller flag accordingly. */ pointer -> hi_caller = HI_TASK; else if ((pointer -> hi_thread = (VOID *) TCC_Current_HISR_Pointer()) != NU_NULL) /* HISR thread. Set the caller flag accordingly. */ pointer -> hi_caller = HI_HISR; else /* Neither a task or HISR, it caller must be initialization. */ pointer -> hi_caller = HI_INITIALIZE; /* Move the write index. */ HID_Write_Index++; /* Check for a wrap condition on the write index. */ if (HID_Write_Index >= HI_MAX_ENTRIES) /* Wrap condition present, adjust the write index to the top of the table. */ HID_Write_Index = 0; /* Increment the entries counter, if the maximum has not yet been reached. */ if (HID_Entry_Count < HI_MAX_ENTRIES) /* Increment the total entries counter. */ HID_Entry_Count++; else /* Drag the read index along with the write index. */ HID_Read_Index = HID_Write_Index; } /* Determine if there was protection in force before call. */ if (save_protect) { /* Make saved protection the current again. */ TCT_Set_Current_Protect(save_protect); /* Release the history protection. */ TCT_Unprotect_Specific(&HID_History_Protect); } else /* Release protection. */ TCT_Unprotect(); /* Return to user mode */ NU_USER_MODE();}/*************************************************************************//* *//* FUNCTION *//* *//* HIC_Retrieve_History_Entry *//* *//* DESCRIPTION *//* *//* This function retrieves the next oldest entry in the history *//* table. If no more entries are available, an error status is *//* returned. *//* *//* CALLED BY *//* *//* Application *//* *//* CALLS *//* *//* TCT_Protect Protect history structures *//* TCT_Unprotect Release history protection *//* *//* INPUTS *//* *//* id Destination for entry id *//* param1 Destination for parameter 1 *//* param2 Destination for parameter 2 *//* param3 Destination for parameter 3 *//* time Destination for time of entry*//* task Destination of task pointer *//* hisr Destination of hisr pointer *//* *//* OUTPUTS *//* *//* None *//* *//* HISTORY *//* *//* DATE REMARKS *//* *//* 03-01-1993 Created initial version 1.0 *//* 04-19-1993 Verified version 1.0 *//* *//*************************************************************************/STATUS HIC_Retrieve_History_Entry(DATA_ELEMENT *id, UNSIGNED *param1, UNSIGNED *param2, UNSIGNED *param3, UNSIGNED *time, NU_TASK **task, NU_HISR **hisr){STATUS status; /* Completion status */HI_HISTORY_ENTRY *pointer; /* Quick access pointer */NU_SUPERV_USER_VARIABLES /* Switch to supervisor mode */ NU_SUPERVISOR_MODE(); /* Initialize status. */ status = NU_SUCCESS; /* Protect the history data structures. */ TCT_Protect(&HID_History_Protect); /* Determine if there is an entry in the history log. */ if (HID_Entry_Count) { /* Yes, there is at least one entry in the history log. */ /* Build a pointer to the next location to read from in the table. */ pointer = &HIC_History_Table[HID_Read_Index]; /* Place the necessary information into the history table at the current location. */ *id = pointer -> hi_id; *param1 = pointer -> hi_param1; *param2 = pointer -> hi_param2; *param3 = pointer -> hi_param3; *time = pointer -> hi_time; /* Now determine what thread the entry was made from. */ if (pointer -> hi_caller == HI_TASK) { /* Setup the task return parameter. */ *task = (NU_TASK *) pointer -> hi_thread; *hisr = NU_NULL; } else { /* In either HISR or initialize case place the thread value in the HISR return parameter. */ *hisr = (NU_HISR *) pointer -> hi_thread; *task = NU_NULL; } /* Move the read index. */ HID_Read_Index++; /* Check for a wrap condition on the read index. */ if (HID_Read_Index >= HI_MAX_ENTRIES) /* Wrap condition present, adjust the read index to the top of the table. */ HID_Read_Index = 0; /* Decrement the entries counter. */ HID_Entry_Count--; } else /* Return the end of history log status. */ status = NU_END_OF_LOG; /* Release protection. */ TCT_Unprotect(); /* Return to user mode */ NU_USER_MODE(); /* Return completion status to the caller. */ return(status);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -