我是C开发的软件工程方面的新手;有没有人有一个很好的指导如何为C项目(特别是嵌入式)设计错误跟踪或错误控制系统?谈论C库的错误跟踪也会有所帮助。
答案 0 :(得分:5)
根据我的经验,这里的策略属于几个阵营。
使用全局变量ala errno。这是如何工作的本质上任何函数都可以在全局变量中存储错误代码,因此在执行该函数后,您可以读取错误代码以查看它是否正确执行。在多线程环境中工作时,存在一些明显的问题。虽然POSIX.1c指定了该问题的解决方案appears。
让每个函数都返回错误代码。例如:
RESULT_CODE my_function(int param1, int param2);
RESULT_CODE error_code = my_function(10, 2);
这种方法的问题在于你无法直接从函数返回值。
每个函数都有一个额外的参数来存储结果代码。例如:
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...
}
我已经看到这种方法在商业RTOS中成功使用,并且个人更喜欢它,因为我发现它是限制性最小的。唯一可能的缺点是,即使您不关心结果,也必须显式声明一个变量来存储错误代码。从某种意义上说,我实际上有点像那个要求,因为它迫使你不断思考如何处理错误。
答案 1 :(得分:1)
这些链接可能会有所帮助:
答案 2 :(得分:1)
这些是您需要定义的基本内容:
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*/
}
您还可以使用更多参数来指示哪个模块正在发送错误,但我认为基本上就是这样。