8

組み込みシステムで使用するコンパクトなデバッグ出力/単体テスト ユーティリティに取り組んでいます。

コンパクトな方法で、シリアル ポート経由でメッセージを 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プリプロセッサにタスクを引き継がせる創造的な方法が他にあるのでしょうか?

4

2 に答える 2

6

ソースコードのファイル名をプログラムに保存することが、メモリにとってそれほど大きな問題になるかどうかはわかりません。それらを取得できる場合は、次のような変数を宣言してconst char *fname = __FILE__;から、ある種のチェックサム、ハッシュ、または CRC を計算し、ファイル名の代わりにこの値を送信することができます。受信側では、ハッシュ値をファイル名の 1 つに一致させることができます。ただし、ファイル名のハッシュが衝突しないようにする必要があります。

別のアプローチは、makefiles や perl などを使用してファイル カウンターを維持し、それをマクロとして gcc にフィードすることgcc [someparams1] -DFILENUMBER=%FILECOUNTER% somefile.c [someparams2]です%FILECOUNTER%。ここでは、ソース ファイルのコンパイルの固定順序を導入する必要がある場合があります。

2 つの方法を組み合わせて、カウンタの代わりにハッシュを gcc に供給することができます。たとえば-DFILENAMEHASH=%HASH%、 where%HASH%は、コンパイル スクリプトがファイル名に基づいて生成する数値定数に展開されます。

于 2013-04-28T13:54:54.167 に答える
1

FILEから取得したものに基づいて 16 ビットのハッシュ番号を作成することを検討しましたか? 完璧ではないかもしれませんが(衝突を読んでください)、あなたのニーズには十分かもしれません. 許容できる場合は、ハッシュ番号 ID を問題のファイルにマップできるように、外部ルックアップ テーブルが必要になります。

このアイデアがお役に立てば幸いです。

于 2013-04-28T14:11:09.893 に答える