9

ミッションクリティカルな組み込みアプリケーションのメモリをどのように管理する必要がありますか?

グーグルでいくつかの記事を見つけましたが、本当に役立つ実用的なガイドを特定することができませんでした。

動的メモリ割り当てはDO-178b禁止されていますが、メモリをどのように管理しますか?事前にすべてを事前に割り当て、割り当てが必要な各関数へのポインタを送信しますか?スタックに割り当てますか?グローバル静的アロケータを使用しますか(ただし、動的割り当てと非常によく似ています)?

回答は、通常の回答、リソースへの参照、または優れたオープンソース組み込みシステムへの参照などの形式にすることができます。

明確化:ここでの問題は、組み込みシステムでメモリ管理が利用できるかどうかではありません。しかし、信頼性を最大化するための組み込みシステムの優れた設計は何ですか。

バッファプールを静的に事前割り当てし、動的に取得および削除することが、メモリを動的に割り当てることと異なる理由がわかりません。

4

7 に答える 7

4

組み込みシステムを扱ったことがある人として、これまでのところそれほど厳密ではありませんが(DO-178Bを読んだことがあります):

  • u-bootブートローダーを見ると、グローバルに配置された構造で多くのことが行われています。正確なアプリケーションによっては、グローバル構造とスタックを回避できる場合があります。もちろん、そこには再入可能性と関連する問題がありますが、これらは実際にはブートローダーには当てはまりませんが、あなたには当てはまる可能性があります。
  • 事前割り当て、事前割り当て、事前割り当て。設計時に配列/リスト構造などのサイズをバインドできる場合は、それをグローバル(または静的グローバル-Ma、カプセル化を参照)として宣言します。
  • スタックは非常に便利です。必要に応じて使用してください。ただし、スタックスペースがなくなるまで、スタックの割り当てを簡単に行うことができるため、注意が必要です。私がかつてデバッグしていることに気付いたコードの中には、複数の関数の文字列管理に1kのバッファーを割り当てるものがあります...デフォルトのスタックサイズが4kであるため、バッファーの使用が別のプログラムのスタックスペースに影響を与えることがありました。
  • バッファプールのケースは、実装方法によって異なる場合があります。コンパイル時に既知のサイズの固定サイズのバッファーを渡す必要があることがわかっている場合は、完全な動的アロケーターよりも、バッファープールを処理する方が正確さを示すのが簡単です。バッファが失われないことを確認し、処理が失敗しないことを確認する必要があります。ここにいくつかの良いヒントがあるようです:http://www.cotsjournalonline.com/articles/view/101217

しかし、実際には、 http://www.do178site.com/に参加することであなたの答えが見つかるかもしれないと思います

于 2010-03-18T16:32:05.480 に答える
4

私はDO-178B環境(飛行機用のシステム)で働いてきました。私が理解したのは、動的割り当てを許可しない主な理由は主に認証であるということです。認証は、テスト(ユニタリ、カバレッジ、統合など)を通じて行われます。これらのテストでは、プログラムの動作が100%予測可能であり、プロセスのメモリフットプリントが実行ごとに同じになることを証明する必要があります。動的割り当てはヒープ上で行われるため(失敗する可能性もあります)、それを簡単に証明することはできません(ハードウェアから記述されたコードまで、すべてのツールをマスターすれば可能になると思いますが...)。静的割り当てではこの問題は発生しません。そのため、このような環境では現時点ではC++が使用されていませんでした。(それは約15年前でした、それは変わったかもしれません...)

実際には、決定論的なものがあることを保証する多くの構造体プールと割り当て関数を作成する必要があります。あなたは多くの解決策を想像することができます。重要なのは、(大量のテストを使用して)高レベルの決定論的動作を証明する必要があるということです。手作りの開発が決定論的に機能することを証明する方が、linux+gccがメモリの割り当てにおいて決定論的であることを証明する方が簡単です。

ちょうど私の2セント。かなり前のことですが、状況は変わったかもしれませんが、DO-178Bのような認証に関しては、どのような状況でもいつでもアプリが同じように機能することを証明することが重要です。

于 2010-03-18T18:51:45.167 に答える
3

免責事項:私はDO-178bを特に使用したことはありませんが、認定システム用のソフトウェアを作成しました。

私が開発者である認定システムでは、...

  1. 動的メモリ割り当ては、初期化フェーズでのみ受け入れられました。
  2. 動的メモリの割り当て解除は決して受け入れられませんでした。

これにより、次のオプションが残りました...

  • 静的に割り当てられた構造を使用します。
  • 構造のプールを作成し、プールから取得/解放してプールに戻します。
  • 柔軟性を高めるために、初期化フェーズでプールのサイズまたは構造の数を動的に割り当てることができます。しかし、その初期化フェーズを過ぎると、私たちは自分たちが持っていたものに固執しました。

私たちの会社は、構造物のプールを見つけて、プールから取得/解放/プールに戻すことが最も有用であることがわかりました。モデルを維持し、最小限の問題で物事を決定論的に保つことができました。

お役に立てば幸いです。

于 2010-03-18T13:26:36.520 に答える
2

リアルタイムで長時間実行されるミッションクリティカルなシステムは、メモリを動的に割り当ててヒープから解放するべきではありません。必要であり、それを中心に設計できない場合は、独自の割り当てられた固定プール管理スキームを作成します。はい、可能な限り事前に固定で割り当てられます。他の何かが最終的なトラブルを求めています。

于 2010-03-18T13:09:05.840 に答える
0

スタックからすべてを割り当てることは、通常、組み込みシステムまたは割り当てが失敗する可能性が許容できない他の場所で行われます。DO-178bが何であるかはわかりませんが、mallocがプラットフォームで使用できないことが問題である場合は、それを自分で実装することもできます(独自のヒープを実装する)が、実行時に割り当てが失敗する可能性がありますもちろん、スペースが足りません。

于 2010-03-18T13:02:21.003 に答える
0

100%確実にする方法はありません。

FreeRTOSのメモリアロケータの例をご覧ください。私が間違っていなければ、それらは静的プールを使用します。

于 2010-03-18T13:11:13.110 に答える
0

この質問も興味深いと思うかもしれません。動的割り当ては、スペースが強化された設定では禁止されていることがよくあります(実際、コアメモリはまだ有用です)。

通常、malloc()が使用できない場合は、スタックを使用します。Tronicが言ったように、malloc()を使用しない理由は、失敗する可能性があるためです。グローバル静的プールを使用している場合は、内部のmalloc()実装をフェイルプルーフにすることができると考えられます。

それは本当に、本当に、本当に、目の前のタスクとボードが何にさらされるかによって異なります。

于 2010-03-18T13:12:22.733 に答える