0

VxWorks で C プログラムの複数のインスタンスを実行する必要があります (VxWorks にはグローバル名前空間があります)。問題は、C プログラムがグローバル名前空間で競合するグローバル変数 (そのプログラムの特定のインスタンスで使用するためのもの) を定義していることです。これを機能させるために、プログラムに最小限の変更を加えたいと思います。すべてのアイデアを歓迎します!

よろしく

ところで... グローバル変数がベスト プラクティスではないことを言及するのは適切な時期ではありません。

4

4 に答える 4

1

最も簡単な方法は、タスク変数を使用することです(taskVarLibのドキュメントを参照)。

タスク変数を使用する場合、変数は現在コンテキスト内にあるタスクに固有です。コンテキストスイッチでは、現在の変数が保存され、新しいタスクの変数がロードされます。

注意点は、タスク変数は32ビットの数値にしかなり得ないということです。また、各グローバル変数は(taskVarAdd?への独自の呼び出しを介して)個別に追加する必要があり、コンテキストスイッチに時間を追加します。

また、グローバル変数を他のタスクと共有することはできません。
ISRでタスク変数を使用することはできません。

于 2009-01-09T14:59:38.307 に答える
1

別の可能性:
Vxworks 6.x を使用している場合は、リアルタイム プロセス アプリケーションを作成できます。
これは、プログラムの各インスタンスが他のインスタンスから独立した独自のグローバル メモリ空間を持つプロセス モデル (Unix/Windows と同様) に従います。

于 2009-03-09T18:22:49.313 に答える
0

同じベンダーの2つのサードパーティライブラリを統合するときに、これを解決する必要がありました。両方のライブラリは同じシンボル名のいくつかを使用しましたが、それらは互いに互換性がありませんでした。これらはベンダーからのものであったため、検索して置き換える余裕はありませんでした。また、(a)2つのライブラリが同じタスクから呼び出される可能性があり、(b)重複シンボルの一部が関数であったため、タスク変数も適用できませんでした。

それぞれlib1とlib2にリンクされたapp1とapp2があると仮定します。両方のライブラリは同じシンボルを定義するため、互いに非表示にする必要があります。

幸い(GNUツールを使用している場合)objcopyを使用すると、リンク後に変数のタイプを変更できます。

これがソリューションのスケッチです。必要に応じて変更する必要があります。

まず、app1の部分リンクを実行してlib1にバインドします。ここでは、app1の*.oがapp1_tmp1.oにすでに部分的にリンクされていることを前提としています。

    $(LD_PARTIAL) $(LDFLAGS) -Wl,-i -o app1_tmp2.o app1_tmp1.o $(APP1_LIBS)

次に、作成したtmp2オブジェクトのlib1からすべてのシンボルを非表示にして、app1の「実際の」オブジェクトを生成します。

    objcopymips `nmmips $(APP1_LIBS) | grep ' [DRT] ' | sed -e's/^[0-9A-Fa-f]* [DRT] /-L /'` app1_tmp2.o app1.o

app2に対してこれを繰り返します。これで、app1.oとapp2.oを、競合することなく最終的なアプリケーションにリンクする準備が整いました。

このソリューションの欠点は、ホストシェルからこれらのシンボルにアクセスできないことです。これを回避するには、デバッグのためにライブラリのいずれかを非表示にするシンボルを一時的にオフにします。

于 2009-02-16T17:58:55.503 に答える
0

別の可能な解決策は、アプリケーションのグローバル変数を静的構造に配置することです。例えば:

から:

int global1;
int global2;

int someApp()
{
   global2 = global1 + 3;
   ...
}

TO:
typedef struct appGlobStruct {
  int global1;
  int global2;
} appGlob;

int someApp()
{
   appGlob.global2 = appGlob.global1 + 3;
}

これは、単にアプリケーションコードの検索と置換に変わります。コードの構造に変更はありません。

于 2009-01-09T15:07:36.840 に答える