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 元组表示(Bus #, Device #, Function #)。设备编号由 PCI 卡插入的插槽决定。考虑到多个 PCI 总线的可能性,处理事情的顺序可能会变得复杂。

当使用 PCI Auto 配置时,您指定 PCI 内存窗口的基地址和大小(有多个可能的 PCI 内存窗口)。然后代码进入 PCI 总线并检测设备。当检测到设备时,它会告诉 PCI 系统它需要多少内存,并且系统会在 PCI 窗口内为该设备映射地址。在我的示例中,所有设备都请求了 0x01000000 的 RAM。

当 PCI 配置是静态的并且不会改变时,这很有效。然而,正如我们所看到的,如果我们添加一个新设备(CPCI),那么设备的顺序会发生变化,这会导致一些地址也发生变化。

PCI 自动配置简化了生活,因为您不必担心提前配置所有设备。他们刚刚被发现。
但是,如果配置是可变的,您可能需要手动配置:即提前知道可能存在哪些设备并尝试配置它们。好处之一是,您可以完全控制分配给给定 PCI 设备的地址。

To get back to your question, how do you know the address? If you have access to the vxWorks shell, you can use the pciConfigTopoShow(), which should show you the various PCI devices found and their address spaces.

于 2011-04-28T12:22:56.607 回答