📄 erc.c
字号:
/*************************************************************************/
/* */
/* Copyright Mentor Graphics Corporation 2004 */
/* All Rights Reserved. */
/* */
/* THIS WORK CONTAINS TRADE SECRET AND PROPRIETARY INFORMATION WHICH IS */
/* THE PROPERTY OF MENTOR GRAPHICS CORPORATION OR ITS LICENSORS AND IS */
/* SUBJECT TO LICENSE TERMS. */
/* */
/*************************************************************************/
/*************************************************************************/
/* */
/* FILE NAME VERSION */
/* */
/* erc.c Nucleus PLUS 1.15 */
/* */
/* COMPONENT */
/* */
/* ER - Error Management */
/* */
/* DESCRIPTION */
/* */
/* This file contains the core routines for the Error management */
/* component. */
/* */
/* DATA STRUCTURES */
/* */
/* None */
/* */
/* FUNCTIONS */
/* */
/* ERC_System_Error System error function */
/* ERC_Assert System assertion routine */
/* */
/* DEPENDENCIES */
/* */
/* tc_defs.h Thread control definitions */
/* er_extr.h Error handling functions */
/* */
/*************************************************************************/
#define NU_SOURCE_FILE
#ifdef NU_ERROR_STRING
#include <stdio.h> /* Standard I/O functions */
#endif
#include "plus/inc/tc_defs.h" /* Thread control constants */
#include "plus/inc/er_extr.h" /* Error handling functions */
/* Define external inner-component global data references. */
extern INT ERD_Error_Code;
#ifdef NU_ERROR_STRING
extern CHAR ERD_Error_String[];
#endif
#ifdef NU_DEBUG
extern UNSIGNED ERD_Assert_Count;
#endif
/* Define direct access to a thread component variable. */
extern VOID *TCD_Current_Thread;
/*************************************************************************/
/* */
/* FUNCTION */
/* */
/* ERC_System_Error */
/* */
/* DESCRIPTION */
/* */
/* This function processes system errors detected by various */
/* system components. Typically an error of this type is */
/* considered fatal. */
/* */
/* CALLED BY */
/* */
/* Various Components */
/* */
/* CALLS */
/* */
/* None */
/* */
/* INPUTS */
/* */
/* error_code Code of detected system error*/
/* */
/* OUTPUTS */
/* */
/* None */
/* */
/*************************************************************************/
VOID ERC_System_Error(INT error_code)
{
#ifdef NU_ERROR_STRING
INT i;
CHAR *pointer;
CHAR name[NU_MAX_NAME+1];
#endif
NU_SUPERV_USER_VARIABLES
/* Switch to supervisor mode */
NU_SUPERVISOR_MODE();
/* First place the error code into the global variable. */
ERD_Error_Code = error_code;
#ifdef NU_ERROR_STRING
/* Build string that corresponds to the error. */
switch(error_code)
{
case NU_ERROR_CREATING_TIMER_HISR:
/* Build string that indicates an error occurred creating the timer
HISR. */
sprintf(ERD_Error_String,"%s\n", "Error Creating Timer HISR");
break;
case NU_ERROR_CREATING_TIMER_TASK:
/* Build string that indicates an error occurred creating the timer
Task. */
sprintf(ERD_Error_String,"%s\n", "Error Creating Timer Task");
break;
case NU_STACK_OVERFLOW:
/* Build string that indicates a stack overflow occurred. */
name[NU_MAX_NAME] = (CHAR) 0;
pointer = (((TC_TCB *) TCD_Current_Thread) -> tc_name);
for (i = 0; i < NU_MAX_NAME; i++)
name[i] = *pointer++;
sprintf(ERD_Error_String,"%s %s\n", "Stack Overflow in task/HISR: ",
name);
break;
case NU_UNHANDLED_INTERRUPT:
/* Build string that indicates an error occurred because of an
unhandled interrupt. */
sprintf(ERD_Error_String,"%s\n", "Unhandled interrupt error");
break;
}
#endif
/* This function cannot return, since the error is fatal. */
while(1)
{
}
/* No need to return to user mode because of the infinite loop. */
/* Returning to user mode will cause warnings with some compilers. */
}
/**************************************************************************
This routine should appear last in this file and must *NOT* use the
NU_ASSERT macro.
**************************************************************************/
#ifdef NU_ASSERT /* Don't use NU_ASSERT past this point */
#undef NU_ASSERT
#define NU_ASSERT(ignore) ((void) 0)
#endif
#ifdef NU_ASSERT2
#undef NU_ASSERT2
#define NU_ASSERT2(ignore) ((void) 0)
#endif
/*************************************************************************/
/* */
/* FUNCTION */
/* */
/* ERC_Assert */
/* */
/* DESCRIPTION */
/* */
/* This public routine is called when an assertion made by the */
/* NU_ASSERT (or NU_ASSERT2) macro fails. By default, this routine */
/* simply counts the number of failed assertions. A breakpoint can */
/* be set in the routine to observe failed assertions, or the */
/* routine can be customized to perform some action, such as */
/* printing the failed assertion as a message, etc. */
/* */
/* CALLED BY */
/* */
/* NU_ASSERT macro */
/* NU_ASSERT2 macro */
/* */
/* CALLS */
/* */
/* None */
/* */
/* INPUTS */
/* */
/* test Pointer to string of failed assertion test */
/* name File name of file containing failed assertion */
/* line Location of failed assertion in above file */
/* */
/* OUTPUTS */
/* */
/* None */
/* */
/*************************************************************************/
#ifdef NU_DEBUG
void ERC_Assert(CHAR *test, CHAR *name, UNSIGNED line)
{
NU_SUPERV_USER_VARIABLES
#ifdef NU_ENABLE_HISTORY
/* Make an entry that corresponds to this function in the system history
log. */
HIC_Make_History_Entry(NU_ASSERT_ID, (UNSIGNED) test,
(UNSIGNED) name, line);
#endif
/* Switch to supervisor mode */
NU_SUPERVISOR_MODE();
/* Set breakpoint here to catch failed assertions. */
ERD_Assert_Count += 1;
/* Return to user mode */
NU_USER_MODE();
}
#endif /* NU_DEBUG */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -