有没有人对C的设计和错误跟踪/控制系统有很好的指导?

时间:2009-07-21 19:33:39

标签: c embedded

我是C开发的软件工程方面的新手;有没有人有一个很好的指导如何为C项目(特别是嵌入式)设计错误跟踪或错误控制系统?谈论C库的错误跟踪也会有所帮助。

3 个答案:

答案 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)

这些是您需要定义的基本内容:

  • 跟踪级别(例如,调试,警报,警告,信息,严重等)。您还应该设置当前跟踪级别,因此如果当前跟踪级别为INFO,则会打印所有跟踪级别高于info的消息。如果当前跟踪级别很关键,则只打印关键消息。

   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;

  • 一个消息队列,您应该有一个机制,每个人都可以发送消息,这些消息正确排队。由于您正在使用嵌入式系统,因此这一点非常重要您不希望花时间在实时操作系统上打印调试消息。因此,管理错误代码的线程应该具有非常低的优先级,并且所有收到的消息都应该发布到队列中,因此当调度程序决定调用它时,则将printfs执行到控制台或您决定的任何输出。

所以你的错误方法将是这样的:


TraceError(TraceLevelType traceLevel, ErrorType errorType, char *msg)
{
    if(CURRENT_TRACE_LEVEL <= traceLevel)
       /* Ignore message */
    else
       /*Queue the Message*/
}         

您还可以使用更多参数来指示哪个模块正在发送错误,但我认为基本上就是这样。