- 締切済み
ログ取得のプログラム
はじめまして。 組み込みOS(iTron)で開発を行っています。 で、デバッグ用にログを取得してコマンドで確認しようと考えています。 そこで質問なんですが、 ・ログデータを書き込むメモリは動的確保と静的確保で違いはあるのでしょうか? ・ログ書き込み用のメモリがなくなったら上書き形式で古いのから消していきたいのですが、どのようなプログラムで実現できるのでしょうか? 各ログデータに次ポインタを持たせて、そこで次のログデータのアドレスを示すことでできるかなと思っていますが。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- SilverThaw
- ベストアンサー率32% (260/806)
>組み込みOS(iTron)で開発を行っています。 ということが前提であれば、ログ領域専用にメモリを「独立して」静的に割り当ててください。 動的ではただでさえ、逼迫する可能性のあるスタック/ヒープメモリを無駄に使用することになり、通称のシステムの動作そのものに障害が発生する可能性があります。 >・ログデータを書き込むメモリは動的確保と静的確保で違いはあるのでしょうか? 前述のとおり組み込みの場合は静的。 >・ログ書き込み用のメモリがなくなったら上書き形式で古いのから消していきたいのですが、どのようなプログラムで実現できるのでしょうか? FIFOを利用したリングバッファを使用するのは他の方と同様。 但し、この「ログを出力する」という処理自体がシステムの負荷になるため、最低限の処理として影響を及ぼさないようにする。 また、「発生した内容をそのまま」記載すると使用するメモリが多くなるため、 「ログ書き込みモジュール番号」「エラー番号」「補足値1」「補足値2」 といった定型のサイズと内容を決め使用する。 >各ログデータに次ポインタを持たせて、そこで次のログデータのアドレスを示すことでできるかなと思っていますが。 は、メモリのロスと分断化が発生する可能性があり、その後に大きなメモリを確保する処理が動作できなくなるので無意味。 ところで、「組み込み」なら最初に使用する(可能性のある)メモリについてそれぞれのモジュールで算出して使用するH/W(のメモリ)で対応できるか検討するはずですが… これを行わないと、「どれだけ記録する(記録できるメモリを確保できるか)」ということも算出できませんから。
- chie65536(@chie65535)
- ベストアンサー率44% (8800/19959)
VC++ならArrayListを、Borland C++ならStringListを使うのが楽なのですが、iTronのC++には類似のライブラリクラスは無いのでしょうか? Borland C++でStringListを使用した場合は、以下のように「とても楽」にコーディングできます。 ・ログ用リスト変数の宣言 TStringList *LogList; ・プログラム起動時の初期化とログの読み込み LogList = new TStringList(); //動的に確保 LogList->LoadFromFile("LogFile.Log"); //ログの読み込み ・ログの追加 if (LogList->Count >= 2000) { //2000行以上なら LogList->Delete(0); //最も古い1行を削除して2000行以上にしない } LogList->Add("記録したいログの内容"); //末尾に1行追加(改行は不要) LogList->SaveToFile("LogFile.Log"); //強制終了してしまった場合に備え、ログに1行追加するたびに、ログをファイルに書き込む ・プログラム終了時のログの書き込みとメモリの解放 LogList->SaveToFile("LogFile.Log"); //ログの書き込み delete LogFile; //メモリ解放 他のC++でも、可変リストを扱えるクラスがあるなら、そのクラスから派生させた新規のクラスにロード、セーブの機能を付ければ、同様のクラスが作れます。
- Interest
- ベストアンサー率31% (207/659)
こんにちは。 > ・ログデータを書き込むメモリは動的確保と静的確保で違いはあるのでしょうか? 差はないと思います。無いと思いますが、ログを残す領域はシステムが稼働している間はずっと使い続けるので、動的に確保する意味がありません。なので、私は静的に(外部変数として)確保してしまうのが良いと思っています。 > ・ログ書き込み用のメモリがなくなったら上書き形式で古いのから消していきたいのですが、 > どのようなプログラムで実現できるのでしょうか? リングバッファにして、古いデータをどんどん上書きしていけばご要望のものが実現できます。リングバッファ(FIFO)の例はここを参照してください。 http://www.nurs.or.jp/~sug/soft/super/fifo.htm
- zwi
- ベストアンサー率56% (730/1282)
>・ログデータを書き込むメモリは動的確保と静的確保で違いはあるのでしょうか? 違いが特にないと思いますが、プログラム中に動的確保があるとログのメモリが分断されて管理が面倒です。 >・ログ書き込み用のメモリがなくなったら上書き形式で古いのから消していきたいのですが、どのようなプログラムで実現できるのでしょうか? 上書きで消せるのであれば、ログは同じサイズですよね? だったら構造体配列で始めから必要サイズを確保するのが良いと思います。連続しているのでデバッガのダンプで見るときも楽ですから。 リングバッファとして扱えば上書き管理も単純です。 >各ログデータに次ポインタを持たせて、そこで次のログデータのアドレスを示すことでできるかなと思っていますが。 リスト構造はデバッガで追うのが面倒ですのでお勧めしません。