3

ARM uC で VxWorks アプリケーションを実行しています。

まず、アプリケーションを要約します。

アプリケーションは、サードパーティ スタックとゲートウェイ アプリケーションで構成されます。OS の非依存性をサポートするために、オペレーティング システムの抽象化レイヤーを実装しました。

基礎となるスタックには、二重にリンクされたリストにメモリブロックを保持する独自のメモリ管理および制御機能があります。

例えば ​​; malloc/new 、 free/delege を直接実行するのではなく、OSA レイヤーのルーチンを呼び出し、OS からメモリを取得してリストに入れ、このメモリをアプリケーションに返します (ルーチン : XXAlloc 、 XXFree、XXReAlloc)。

メモリを解放するときは、再び XXFree を使用します。

実際、このブロックは構造体であり、

- マジック ナンバーは、メモリ ブロックの開始と終了を示します - ユーザーが割り当てたサイズを要求しました - アラインメントの問題による実際のサイズ 前と次のポインタ - アプリケーションに返されたメモリの断片へのポインタ。アプリケーションのどこで xxAlloc が呼び出されたかを示すリンク レジスタ。

このブロック構造スタックを使用すると、ブロックが破損しているかどうかを確認できます。

また、Linux から移植された pthread ライブラリもあり、これを使用してスレッドを作成/終了します (現在 22 のスレッドがあります)。同期オブジェクト (イベント、ミューテックスなど)。

taskSpawn によって呼び出されるメインタスクがあり、後でこのタスクが他のスレッドを作成しました。

これは、アプリケーションとその VxWorks インターフェイスの説明でした。

問題は :

タスクの 1 つが VxWorks によって突然破棄され、何が問題なのかについての情報がありません。jtag デバッガーもあり、VxWorks taskDestoy() ルーチンにヒットしますが、コール スタックは PC も r14 も情報を提供しません。

巨大な xxAlloc が実行されるコード内の特定のルーチンが疑わしいのですが、問題が非常に散発的に発生し、それをソース コードにマップできる手がかりがありません。

OSは例外を検出し、静かに処理を実行すると思います。

どんな助けでも素晴らしいでしょう

よろしく

4

3 に答える 3

1

解決しました。

私は隔離されたテストをしました。0x55 の malloc と memset で 20MB を割り当て、アプリケーションのスレッドを停止しました。

そして、0x55 以外のデータが書き込まれている場合に 20MB をチェックする別のスレッドを書きました。

そして、何を質問してください!! CPUの他のコンポーネントに属する他のスレッド(他の誰かがそれらを開発した)が、割り当てられたスペースを書き込みます。

ありがとう 4 あなたの助け

于 2009-08-15T21:16:03.953 に答える
0

タスクが終了すると、 taskDestroy() が呼び出されます。巨大な xxAlloc が疑われる場合は、メモリが使い果たされたときに割り当てコードが exit() を呼び出していないことを確認してください。以前、サード パーティの OSAL でこの動作に悩まされたことがあります。

于 2009-07-27T22:54:55.580 に答える