組み込み型C言語——設計デバッグマクロ

1706 ワード

前言
マクロの設計を調整して、マクロの使い方を整理します
リダイレクトprintf印刷
組み込み機器は基本的にRS 232シリアルポートをデバッグIOインタフェースとして構成し、下位シリアルポートの単一バイト出力関数がSERIAL_PutChar()であると仮定し、fputc()fputs()を利用してprintf関数にリダイレクトする
    void fputc(int byte, FILE* stream)
    {
        (void)stream;

        SERIAL_PutChar(byte);
    }

    void fputs(const char *pstr, FILE *stream)
    {
        (void)stream;

        while(*pstr)
        {
            SERIAL_PutChar(*pstr++);
        }
    }

このようにコードの中でprintf()関数を利用して出力する文字列はすべておとなしくデバッグシリアルポートから出てきます
マクロ使用シーンのデバッグ
あるCドライバモジュールは、デバッグ時にデバッグ情報を印刷したいが、製品コードにはデバッグ情報が表示されない.
V 1-単一パラメータマクロ
    #define DRV_DEBUG 1
    #if DRV_DEBUG
        #define DRV_PRINT(x) printf(x)
    #else
        #define DRV_PRINT(x) 
    #endif

このバージョンのDRV_PRINT(x)では、単一の変数である純粋な文字列しか出力できません.
    void foo()
    {
        DRV_PRINT("Driver Initialize Success!");
    }

デバッグ情報を印刷する必要がない場合は、DRV_DEBUGマクロ定義を変更します.
    #define DRV_DEBUG 0

もちろんこのように定義することもできます
    #define DRV_PRINT printf

ただし、マクロが複数のパラメータを呼び出した場合:
    void foo()
    {
        DRV_PRINT("Driver Initialize Success: ver %d.%d !", 1, 2);
    }

製品コードの#define DRV_PRINT(x)がエラーをコンパイルします.
どうしよう? では受け入れられないやり方で、 をプラスします.
    void foo()
    {
        DRV_PRINT(("Driver Initialize Success: ver %d.%d !", 1, 2));
    }

デバッグコードも製品コードもコンパイルOK
v 2-パラメータマクロの指定
続きを待つ
v 3-パラメータ数可変マクロ
続きを待つ