組み込み型C言語——設計デバッグマクロ
前言
マクロの設計を調整して、マクロの使い方を整理します
リダイレクトprintf印刷
組み込み機器は基本的にRS 232シリアルポートをデバッグIOインタフェースとして構成し、下位シリアルポートの単一バイト出力関数が
このようにコードの中で
マクロ使用シーンのデバッグ
あるCドライバモジュールは、デバッグ時にデバッグ情報を印刷したいが、製品コードにはデバッグ情報が表示されない.
V 1-単一パラメータマクロ
このバージョンの
デバッグ情報を印刷する必要がない場合は、
もちろんこのように定義することもできます
ただし、マクロが複数のパラメータを呼び出した場合:
製品コードの
どうしよう?
デバッグコードも製品コードもコンパイルOK
v 2-パラメータマクロの指定
続きを待つ
v 3-パラメータ数可変マクロ
続きを待つ
マクロの設計を調整して、マクロの使い方を整理します
リダイレクト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-パラメータ数可変マクロ
続きを待つ