我对C开发中的软件工程方面还很陌生;是否有一个好的指南,可以教我如何为C项目(特别是嵌入式项目)设计错误跟踪或错误控制系统?如果有关于C库错误跟踪的内容,那就更好了。
Use of global variables ala errno. How this works is essentially any function can store an error code in the global variable, so after executing the function you can read the error code to see if it executed properly. There are some obvious issues here when working in a multithreaded environment. Although it appears that POSIX.1c specifies a solution to that problem.
Have every function return an error code. For example:
RESULT_CODE my_function(int param1, int param2);
RESULT_CODE error_code = my_function(10, 2);
Every function has an extra parameter that stores the result code. For example:
void my_function(int param1, int param2, RESULT_CODE *err);
RESULT_CODE error_code;
my_function(10, 2, &error_code);
switch (error_code)
{
case RESULT_OK:
// all OK
break;
case RESULT_NO_MEM:
// out of memory
break;
// etc...
}
我曾在商业实时操作系统中看到过这种方法的成功应用,并且个人更喜欢它,因为我认为它是最不限制性的。唯一可能的缺点是,即使您不关心结果,您也必须显式声明一个变量来存储错误代码。在某种意义上,我实际上有点喜欢这个要求,因为它迫使您不断地考虑如何处理错误。
以下是您需要定义的基本内容:
enum _TraceLevelType
{
INFO = 0,
DEBUG,
WARNING,
ERROR,
CRITICAL
} TraceLevelType;
enum _ErrorType
{
//Internal errors 0-100
APPLICATION_FAILURE = 0,
...
MEMORY_FAULT,
//UI ERRORS 101-200
INVALID_OPTION_SELECTED = 101,
....
...
}ErrorType;
因此,你的错误方法将是这样的:
TraceError(TraceLevelType traceLevel, ErrorType errorType, char *msg)
{
if(CURRENT_TRACE_LEVEL <= traceLevel)
/* Ignore message */
else
/*Queue the Message*/
}
你也可以添加更多的参数来指示哪个模块发送了错误,但我认为基本上就是这样。