vxWorksを開発プラットフォームとして使用する場合、標準のmain()関数を使用してアプリケーションを作成することはできません。なぜメイン機能がないのですか?
1 に答える
バージョン 6.0 より前の VxWorks は、タスクのカーネル実行環境のみをサポートし、Unix や Windows などの OS 上の従来のアプリケーション実行環境であるプロセスはサポートしていませんでした。タスクには、タスクとして実行するコードのアドレスであるエントリ ポイントがあります。このアドレスは、C またはアセンブリ関数に対応します。「main」という名前のシンボルを使用できますが、カーネル環境でサポートされていない main() 関数に関する C/C++ 言語の仮定があります (特に、argc および argv パラメーターの従来の処理)。さらに、VxWorks 6.0 より前のバージョンでは、すべてのタスクがカーネル コードを実行していました。カーネルを、すべてリンクされたコードの共通リポジトリとして考えると、名前の衝突が発生するため、同じ名前 (「メイン」) の複数のシンボルを使用できないことがわかります。
現在、これはアプリケーション コードをカーネル イメージにリンクしている場合にのみ正確です。アプリケーション コードをダウンロードする場合、モジュール ローダーは、それぞれ main() ルーチンを使用して複数のモジュールをロードすることを受け入れます。ただし、システム シンボル テーブルに登録されている最後の「メイン」シンボルは、ターゲット シェル経由でアクセスできる唯一のシンボルです。最初にロードされたモジュールの 1 つのコードを実行するタスクを開始する場合は、前の main() 関数のアドレスを使用する必要があります。これは可能ですが、便利ではありません。タスクのエントリ ポイントに別の名前を付ける方がはるかに実用的です ("xxxStart" のように、"xxx" はタスクが実行することを意味する名前です)。
VxWorks 6.0 以降、OS はプロセス環境をサポートします。これは、とりわけ、従来の main() ルーチンを持つことができ、その argc および argv パラメーターが適切に処理され、アプリケーション コードがカーネル コンテキストとは異なるコンテキスト (ユーザー コンテキスト) で実行されていることを意味します。 、したがって、アプリケーションコード (不安定になる可能性がある) とカーネルコード (不安定になることは想定されていません) の間の分離が保証されます。パッド