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

私たちの要件の 1 つは、識別子の名前またはテキストを出力することです。これにはルックアップ テーブルを使用します。

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 に準拠する必要があります。

(ARM7 プロセッサを使用するターゲット システムで、IAR 組み込みワークベンチで C89 を使用しています。)

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

の使用enumが受け入れられず、#defineマクロを使用する必要がある場合、この方法に代わる方法は、テキスト ファイルを使用してこれらの例外定義をキャプチャすることです。次に、スクリプトを使用して、テキスト ファイルを解析し、マクロ定義と文字列テーブルの両方に適した C コードを生成できます。

于 2013-08-26T20:48:51.493 に答える