2013-08-26 5 views
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.

(Мы используем C89 с IAR Embedded Workbench с целевой системой, используя процессор ARM7.)

+0

Если само название было бы приемлемой строкой, возможно, вы могли бы ее укрепить. – Jiminion

+0

Почему таблица не синхронизирована, а не просто отсутствует запись? Иногда добавляются ли записи в середине? – Jiminion

ответ

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 
}; 

При использовании enum не является приемлемым, и вы должны использовать #define макросы, альтернатива такому подходу будет использовать текстовый файл, чтобы сохранить эти исключения. Затем, используя скрипт, вы можете проанализировать текстовый файл и сгенерировать соответствующий код C как для определения макросов, так и для таблицы строк.

+0

Мы изгнали 'enum', потому что они подписали значения для кратчайшей емкости, и они не являются уникальным типом типа C++. –

+0

Я не думаю, что макросы предоставляют дополнительное преимущество в последнем пункте. Я обновил ответ альтернативой. – jxh