組み込みシステムで使用するコンパクトなデバッグ出力/単体テスト ユーティリティに取り組んでいます。
コンパクトな方法で、シリアル ポート経由でメッセージを PC に出力できるシステムを作成しました。メモリ スペース/シリアル ポート帯域幅を節約するために、組み込みシステムからメッセージ文字列を取り除き、一意の 16 ビット ID を割り当てました。
すべてのメッセージを 1 つのリストにまとめたので、これは非常に簡単でした。いくつかのマクロはこれを列挙に入れます:
projectdefs.h:
#define MESSAGE_TABLE(MSG) \
MSG(HELLO, "Hello World!") \
MSG(TEST, "Second message #ID 1") \
MSG(TEST2, "Third message #ID 2")
メッセージ.h:
#define MACRO_STR_CONCAT(a,b) a##b
#define MESSAGE_ENUM(codeName, str) MACRO_STR_CONCAT(MSG_, codeName)
typedef enum messageNumbers_e {
MESSAGE_TABLE(MESSAGE_ENUM),
MESSAGE_COUNT
};
#define MESSAGE(codeName) messageSend(MACRO_STR_CONCAT(MSG_, codeName), __LINE__, file_number);
シリアル ポート経由で送信される唯一のデータは、メッセージ ID、行番号、およびファイル番号です (文字列ではないことに注意してください!)。
私が抱えている問題は、Cプリプロセッサ/コンパイラを使用して、すべてのファイルに一意の ID を割り当てる方法です。各ファイル名文字列を組み込みプログラム内に保存したくありません。これは、シリアル ポートのメモリまたは帯域幅を (過剰に) 使用します。
私の考えは、マクロを使用して各ファイルに定数 file_number を定義することです。各ソース ファイルの先頭で次の定義を使用します。
#define ASSIGN_FILENUMBER() enum { file_number = __COUNTER__ };
ただし、各ファイルは個別にコンパイルされるため、__COUNTER__
ステートメントは呼び出されたときに常に 0 から始まり、他のファイルの存在や独自の ID を認識しません。
別の考慮事項は、MakeFile (スクリプト) を編集し、そこにファイル ID 番号を追加することでした。ただし、これにより、プロジェクトのビルド/機能が IDE 構成に密接に結び付けられるため、望ましくありません。さらに、現在の IDE (Mplab X IDE または IAR Embedded Workbench 上の XC16/XC32 コンパイラ) での可能性については確信が持てません。
標準のCプリプロセッサにタスクを引き継がせる創造的な方法が他にあるのでしょうか?