2009-07-27 46 views
3

私はARM uCで動作するVxWorksアプリケーションを持っています。タスクが破壊する理由を特定する方法、VxWorks?

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

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

基本スタックには、メモリブロックを二重リンクリストに保持する独自のメモリ管理&制御機能があります。

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

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

実際にこのブロックは、そのユーザ-size開始メモリブロック の端が原因アライメントの問題前と次ポインタ に実際に -sizeを割り当て要求

-magic数字表示を有する構造体です - アプリケーションに戻されたメモリの部分へのポインタ。 xxAllocアプリケーションがどこに呼び出されたかを示すリンクレジスタ。

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

また、我々は我々が -create /終了スレッド(現在は22件のスレッドがあります) -synchronizationオブジェクトに使用することのLinuxから移植されたライブラリのpthreadている(イベント、ミューテックスを...)

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

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

問題がある:タスクの

1が突然間違っているのかについて何の情報も与えないのVxWorksによって破壊されます。 私はjtagデバッガも持っていて、VxWorksのtaskDestoy()ルーチンにヒットしますが、コールスタックはPCやr14の情報を与えません。

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

私はOSが検出して例外を発生し、その処理を静かに実行していると思います。

あなたのタスクが終了した場合に任意のヘルプは

よろしく

+1

質問を再フォーマットするための提案:最初の問題文とその後の背景情報。このようにして、読者はストーリー全体を読んでそれが一致するかどうかを調べる必要はありません。 – Adriaan

答えて

1

解決しました。

私は単離したテストを行いました。 mallocとmemsetで20MBを割り当て、0x55でアプリケーションを停止しました。

そして、私は0x20以外のデータが書き込まれていれば私の20MBをチェックする別のスレッドを書いています。

そして、何が問題なのですか? CPUの他のコンポーネント(他の誰かがそれらを開発したもの)に属する他のスレッドは、割り当てられた領域を書き込みます。

ありがとうございました。ご協力ありがとうございます。

+0

そして、あなたは答えを受け入れ、あなたの質問をUnansweredから取り除くことができます;) – zxcat

0

素晴らしいことだ、taskDestroy()が呼び出されます。巨大なxxAllocが疑わしい場合は、メモリが使い果たされたときに割り当てコードがexit()を呼び出さないことを確認してください。私は前に第三者OSALでこの動作に噛まれてきました。

+0

こんにちは コードにexit()はありません。 Thnx – tguclu

+0

他の同様の可能性は、タスクのエントリポイントが単に戻ることです。 (出口のような関数は... abort()と呼ばれています) スタックの破損やスタックのオーバーフローの場合にも、この種の動作が見られました。 – bstpierre

0

統合後にデバッグしているような音です。これは仕事の地獄になることができます。 問題を小さなものに分割することをお勧めします。

プロセス

1)あなたは、コードをインストルメント及び/又はVxWorksののインストゥルメンテーション(バージョンに応じて)を使用してより多くの洞察を得ることができます。これにより、何が起こるかをより詳細に把握することができます。すべてをファイルに記録するようにして、タスクが終了する時点から時間内に戻るようにしてください。計装は、より多くの機会に便利なので価値ある投資です。 VxWorksの興味深いフック:Taskhooklib

2)メモリ割り当て/割り当て解除は非常に基本的な機能です。これは、明確に定義されたマルチスレッド環境での徹底した(単体の)テストのための私の最初の候補者です。これを行ってもエラーが見つからない場合は、まずtasが終了した理由を調べ始めるでしょう。

他の可能性のある原因作業が行われたとき

タスクも終了します。..ので、それほど無限ではないループに起因するリターンかもしれません。特にそれが常に同じ仕事であれば、これは私の推測だろう。

また、VxWorksの一部のバージョンでは、MMUのサポートが考慮されています。

関連する問題