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は例外を検出し、静かに処理を実行すると思います。
どんな助けでも素晴らしいでしょう
よろしく