2

現在、ログに記録したい文字列をUARTに送信し、任意の端末を使用してホストで読み取ります。

ロギング時間を短縮し、できれば画像サイズも削減するために (私のフラッシュは小さいです)、組み込みシステムでは文字列が使用されていないことがわかりました。

任意の文字列 (たとえば、ROM アドレス) のハッシュ キーを送信できるサーバーを実装したいと考えています。文字列はファイルまたは画面に出力されます。

私の質問は次のとおりです。

  1. イメージ ファイルから key2string コンバーターを作成する方法 (OS は CMX ですが、一般的に回答できます)
  2. 文字列アドレスを認識し、ROM から除外するイメージを生成する推奨される方法はありますか?
  3. 同様のロガーを実装した既知のジェネリック (オープンソースまたはその他) はありますか?

ありがとう

4

2 に答える 2

2

ハードコードされた文字列を保持するのではなく、回答をハッシュして UART 経由で送信し、結果の画像から何らかの方法で文字列を削除するのではなく、次のことをお勧めします。

エラー コードのインデックスを送信するだけです。PC 側は、そのインデックスを検索して、その条件の文字列を特定できます。デバイス コードをより明確にしたい場合は、インデックスを列挙型にすることができます。

例えば:

enum errorStrings
{
   ES_valueOutOfLimits = 1,
   ES_wowItsGettingWarm = 2,
   ES_randomError = 3,
   ES_passwordFailure = 4
};

したがって、 経由printfで UART にデータを送信する場合は、次のようにすることができます。

printf("%d\n",(int)ES_wowItsGettingWarm);

次に、PC ソフトウェアは、UART に渡された「2」をデコードして、「わあ、暖かくなってきました」という便利な文字列に戻すだけです。

これによりファームウェアは小さく保たれますが、enum を含むファイルと文字列を含むファイルを手動で同期させる必要があります。

于 2013-07-22T21:44:48.133 に答える
1

私の解決策は、ファイル名と行 (14 ~ 20 バイト) を送信し、サーバー側にソース パーサーを配置して、実際のテキストのマップを生成することです。このようにして、実際のコードには「フォーマット」文字列は含まれませんが、各ファイルに対して単一の「ファイル名」文字列が含まれます。さらに、(コード内のすべての文字列を置き換えるのとは異なり) ファイル名を列挙型に簡単に置き換えて、COMM スループットを削減できます。

サンプルの疑似コードがアイデアを明確にするのに役立つことを願っています:

/* target code */
#define PRINT(format,...) send(__FILE__,__LINE__,__VA_ARGS__)
...

/* host code (c++) */
void PrintComm(istream& in)
{
    string fileName;
    int    line,nParams;
    int*   params;
    in>>fileName>>line>>nParams;
    if (nParams>0)
    {
        params = new int[nParams];
        for (int i=0; i<nParams; ++i)
            in>>params[i];
    }
    const char* format = FindFormat(fileName,line);
    ...
    delete[] params;
}
于 2013-07-29T14:12:19.093 に答える