奇妙な問題が発生しています。ある程度追跡できましたが、まだ原因がわかりません。たぶん、誰かがここに光を当てることができますか?
PPCgnu604 ツールチェーンを使用して C++ で開発している VxWorks 5.5 上で PowerPC プロセッサを実行しています。
私は次のようなクラスを持っています:
class MyClass
{
public:
void run( void );
private:
CommandMesssageClass command;
StatusMessageClass status;
};
アプリケーションが開始されると、MyClass のインスタンスが動的に割り当てられ、「実行」関数を指すスレッドが生成されます。基本的に、コマンドをポーリングするだけで、受信時にステータスが返されます。
これはクラスの切り詰められたバージョンであることに注意してください。簡潔にするために、他の多くのメソッドと変数が省略されています。
コマンド メッセージとステータス メッセージの両方がプライベート クラス メンバーとして定義されている場合、動的なメモリ割り当てがないにもかかわらず、メモリ内の使用可能なバイト数が変化するという問題が発生します。これは、決定論的でレートセーフな手順である必要があるもので発生しているため、重要です。
メッセージ宣言の 1 つまたは両方を run 関数に移動すると、追加の割り当てなしで正常に動作します!
C++ の宣言とメモリ割り当てを理解する上で、何か基本的なことが欠けているに違いありません。私の理解では、動的にインスタンス化するクラス インスタンスは、作成時にヒープ (すべてのメンバー変数を含む) に完全に割り当てられます。ここでわかる違いは、メッセージ宣言を実行関数に移動すると、代わりにそれらがスタックに置かれることです。この場合のヒープは、クラス全体のサイズに対応するのに十分な大きさです。特定の部分が使用されるまで十分なメモリが割り当てられていないように見えるのはなぜですか?
メッセージ クラスは、独自の動的割り当てを行いません。(もしそうなら、宣言を移動してもこの場合の動作は変わらず、ヒープのサイズはまだ変化していると思います。)
メモリ割り当てを監視するために、次の VxWorks memLib (または memPartLib) 呼び出しを使用しています。
memPartInfoGet( memSysPartId, &partitionStatus );
...
bytesFree = partitionStatus.numBytesFree;
編集:
明確にするために、MyClass オブジェクトは初期化ルーチンでインスタンス化および初期化され、その後、コードはレート セーフ処理に入ります。この間、シリアル ラインを介してコマンド メッセージを受信すると (コマンドまたはステータス メッセージ オブジェクトとの最初のやり取り)、追加のメモリが割り当てられます (むしろ、空きバイト数が減少します)。動的メモリ割り当ては決定論的ではないため、これは悪いことです。
説明したようにクラス変数を移動することで、問題を取り除くことができました。