2012-02-22 15 views
3

PCからデータを必要とする組み込みハードウェアを開発しています。私はこの情報を提供するためにFAT32フォーマットのSDカードを使用しています。データはCSVにエクスポートするExcelファイルです。私の質問は、char* strtok (char *s, const char *delim)を使ってuC(AT Mega 128L)にこれを処理させるべきか、このCSVファイルをバイナリ形式に変換する小さなユーティリティを書くべきですか?組み込みアプリケーション向けのCSVファイルまたはバイナリファイル

パフォーマンスは、合理的に速い限り、大きな問題でもファイルサイズでもありません。最大の問題はSRAMの使用です。

行の長さは最大です。最大約40文字。約7つのフィールドがあり、そのうちの2つは基本的にインデックスです。 uCは、これらのインデックスを調べ、一致するかどうかを調べることによって、関心のある情報を取得することになっています。たとえば、uCがインデックス5に格納されているものに関する情報を必要としているとします。次に、ここに行き、他の5つのフィールドを取得して画面に表示する必要があります。 uCはファイルへの「ランダムな」アクセスを必要とします。つまり、インデックス7から何かが必要な場合があります。インデックス70から何かが必要な場合があります。

わかったように、厳密に定義されたフォーマットのバイナリファイル(つまり、各フィールドは固定バイト数になります)。利点は、uCが関心のあるバイトを直接探すことができるということです。例えば、それぞれの 'レコード'が100バイトを占めるとします(これはもっと少なくなりますが、例として説明します)。 uCは、2番目の索引が100から始まり(最初のレコードの場合は0-99)、200の場合は3番目のレコードを認識します。

したがって、7番目のレコードにアクセスする必要がある場合は、700番目のバイトを検索し、関連情報バイナリファイルのアプローチはCSVより優れていますか?私の主な関心事はSRAMの使用と合理的な性能です。

答えて

3

バイナリファイルのアプローチは、いくつかの理由により良いでしょう。あなたが言及していない大きな部分の1つは、フィールド内の文字列データを数値データに変換する必要があります(少なくともインデックスの場合は、他のデータではない場合)時間とRAMで。加えて、strtokはもちろん文字列を検索する必要があります。見ているまで行がわからない場合は、文字列を検索し、読み込んだ各行の整数に変換します。

+1

私は完全に同意します。文字列を処理して数値に変換するのは、リソースを大量に消費します(比較的話しています)。あなたは通常、組み込みシステム上でそれをしようとするよりも、あなたのコンピュータ上のプログラムを使用して、これを行う長期的に良いでしょう。これにより、より高度な言語(RubyやPythonなど)を使用して、組み込みシステムではおそらく利用できない文字列処理を行うこともできます。これらの言語には、CSVや文字列処理をC言語で行うよりもはるかに簡単なライブラリ/機能があります。 – bta

0

テキストファイルをバイナリ形式(すべての数値がバイナリで、すべての要素の型とサイズが接頭辞付き)に変換し、そのファイル(または別のファイル)にインデックスを含めることをお勧めします。すべてのレコードのファイルオフセット。これにより、検索時間を節約できます(インデックス内のバイナリ検索は、現在の位置(または先頭)と必要な次の位置の間でファイル全体を解析するよりも高速です)。すべてのレコードを固定サイズにすることができれば、索引は必要なくなり、すべてがより簡単で高速になります。

関連する問題