0

在我们的项目中,我们有数百个用于错误代码的标识符,例如:

#define SYS_FAIL_EXCEP_PREFETCH_ABORT       0
#define SYS_FAIL_EXCEP_DATA_ABORT       1
#define SYS_FAIL_EXCEP_RESET        2
#define SYS_FAIL_EXCEP_UNDEFINED        3
#define SYS_FAIL_EXCEP_RESERVED     4
#define SYS_FAIL_EXCEP_IRQ_UNVECTORED   5

我们的要求之一是打印标识符的名称或文本。我们为此使用了一个查找表:

typedef struct HAL_Map_Text_ID_struct
{
    unsigned int        id;
    char const * const  text;
} HAL_Map_Text_ID_t;

static const HAL_Map_Text_ID_t  system_failure_text_id_map[] =
{
    //  ID          Text
    // The following text has the prefix SYS_FAIL_EXCEP_
    {SYS_FAIL_EXCEP_PREFETCH_ABORT,                          "PREFETCH_ABORT"},
    {SYS_FAIL_EXCEP_DATA_ABORT,                              "DATA_ABORT"},
    {SYS_FAIL_EXCEP_RESET,                                   "RESET"},
    {SYS_FAIL_EXCEP_UNDEFINED,                               "UNDEFINED"},
    {SYS_FAIL_EXCEP_RESERVED,                                "RESERVED"},
    {SYS_FAIL_EXCEP_IRQ_UNVECTORED,                          "IRQ_UNVECTORED"},
};

我们的问题是当有人添加标识符但忘记更新表时,表和错误代码列表可能不同步。

是否有一个习惯用法或其他过程,我们可以添加一个标识符并且表格会自动更新?

我们更喜欢标识符位于头文件中而表位于源文件中的解决方案。

此外,如果可能,解决方案应符合 MISRA。

(我们使用带有 IAR 嵌入式工作台的 C89,目标系统使用 ARM7 处理器。)

4

1 回答 1

1

您可以使用宏系统来帮助创建标识符更新的单点,这也将更新您的字符串。但是,此方案将您的标识符从宏转换为枚举常量。我正在输入这个,所以它未经测试:

#define SYS_FAIL_EXCEPTIONS \
   SYS_FAIL_EXCEP(PREFETCH_ABORT) \
   SYS_FAIL_EXCEP(DATA_ABORT) \
   SYS_FAIL_EXCEP(RESET) \
   SYS_FAIL_EXCEP(UNDEFINED) \
   SYS_FAIL_EXCEP(RESERVED) \
   SYS_FAIL_EXCEP(IRQ_UNVECTORED)

enum {
    #define SYS_FAIL_EXCEP(X) SYS_FAIL_EXCEP_##X,
    SYS_FAIL_EXCEPTIONS
    #undef SYS_FAIL_EXCEP
};

static const HAL_Map_Text_ID_t  system_failure_text_id_map[] = {
    #define SYS_FAIL_EXCEP(X) { SYS_FAIL_EXCEP_##X, #X },
    SYS_FAIL_EXCEPTIONS
    #undef SYS_FAIL_EXCEP
};

如果使用 anenum是不可接受的,并且您必须使用#define宏,则此方法的替代方法是使用文本文件来捕获这些异常定义。然后,使用脚本,您可以解析文本文件并为宏定义和字符串表生成适当的 C 代码。

于 2013-08-26T20:48:51.493 回答