0

私は、CompactPCI バックプレーンを介して接続された 3 台の SBS (現在の GE Fanuc) C2k シングル ボード コンピュータを継承しており、それらの間で共有メモリを起動して実行する必要があります。私の理解では、以前は の値SM_ANCHOR_ADRSが最初に誰かによって「発見」され、PMC が交換されたり交換されたりするたびに、 の値SM_ANCHOR_ADRSが再び機能するまでいじられていました。今回は、メモリ アドレスをランダムに突くのではなく、そもそもこの値がどのようにして得られるのかを知りたいと思います。

VxMP のマニュアルに、メモリ マップと既知のオフセットが与えられた場合に、VME のこのアドレスを計算する方法の説明があることに気付きました。C2k ユーザーズ マニュアルで同様のメモリ マップを探してみましたが、存在しません。(ボード サポート パッケージで見た PCI 自動構成に関するビットは、それと何か関係があるのでしょうか?)

また、役に立つ場合は、カーネル構成からの関連ビット:
マスター:

SM_MEM_ADRS NONE  
SM_ANCHOR_ADRS (char*)0x4100  
SM_ANCHOR_OFFSET 0x4100  
SM_INT_TYPE SM_INT_NONE  
SM_MAX_WAIT 3000  

スレーブ カード:

SM_MEM_ADRS (SM_ANCHOR_ADRS)  
SM_ANCHOR_ADRS (char*)0x84004100 //this is the number that generally gets fiddled with..  
SM_ANCHOR_OFFSET 0x4100  
SM_INT_TYPE SM_INT_NONE  
SM_MAX_WAIT 3000  

この情報を使用して、CompactPCI バックプレーン上のデバイスの VxWorks の共有メモリ アンカー アドレスを計算するにはどうすればよいでしょうか?

4

1 に答える 1

2

これは実際には、PCI バス アーキテクチャとその動的な性質の機能です。SM_ANCHOR_ADRS は、スレーブ カードの PCI アドレス空間の共有メモリを表します。

問題は、カードを追加すると、PCI アドレス空間が変更される可能性があることです。PCI 自動構成を使用する場合は、基本的に vxWorks にアドレスを割り当てさせます。割り当て順はわかりませんが、PCIバス上でデバイスが検出された順番でアドレス空間が割り当てられていると思います。

私が説明できるかどうか見てみましょう:

PCI アドレス 3 デバイス 4 デバイス (追加 1)
0x80000000 (ベース) +------------------+ +---------------------+
                     | | ホスト ブリッジ | | | ホスト ブリッジ |
                     | | デバイス (0,0,0) | | | デバイス (0,0,0) |
                     | | 0x01000000 サイズ | | | 0x01000000 サイズ |
0x81000000 +------------------+ +---------------------+
                     | | スレーブ 1 | | | スレーブ 1 |
                     | | デバイス (0,4,0) | | | デバイス (0,4,0) |
                     | | 0x01000000 サイズ | | | 0x01000000 サイズ |
0x82000000 +------------------+ +---------------------+
                     | | スレーブ 2 | | | CPCI カード |
                     | | デバイス (0,8,0) | | | デバイス (0,6,0) |
                     | | 0x01000000 サイズ | | | 0x01000000 サイズ |
0x83000000 +------------------+ +---------------------+
                                            | | スレーブ 2 |
                                            | | デバイス (0,8,0) |
                                            | | 0x01000000 サイズ |
                                            +---------------------+

Device タプルは (バス番号、デバイス番号、機能番号) を表します。デバイス番号は、PCI カードが差し込まれているスロットによって決まります。複数の PCI バスが存在する可能性があり、物事が処理される順序が複雑になる可能性があります。

PCI 自動構成を使用する場合は、PCI メモリ ウィンドウのベース アドレスとサイズを指定します (可能な PCI メモリ ウィンドウは複数あります)。その後、コードは PCI バス上を進み、デバイスを検出します。デバイスが検出されると、必要なメモリ量が PCI システムに通知され、システムはそのデバイスの PCI ウィンドウ内のアドレスをマップします。私の例では、すべてのデバイスが 0x01000000 の RAM を要求しました。

これは、PCI 構成が静的で変更されない場合にうまく機能します。ただし、ご覧のとおり、新しいデバイス (CPCI) を追加すると、デバイスの順序が変更され、一部のアドレスも変更されます。

PCI 自動構成は、事前にすべてのデバイスを構成することを心配する必要がないため、生活を簡素化します。それらは発見されたばかりです。
ただし、構成が可変の場合は、おそらく手動で構成する必要があります。つまり、存在する可能性のあるデバイスを事前に把握し、構成を試みる必要があります。利点の 1 つは、特定の PCI デバイスに割り当てるアドレスを完全に制御できることです。

質問に戻りますが、住所はどうやってわかりますか? vxWorks シェルにアクセスできる場合は、pciConfigTopoShow() を使用できます。これにより、検出されたさまざまな PCI デバイスとそれらのアドレス空間が表示されます。

于 2011-04-28T12:22:56.607 に答える