我继承了通过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的共享内存锚地址?
答案 0 :(得分:2)
这实际上是PCI总线架构及其动态特性的一个功能。 SM_ANCHOR_ADRS表示从卡的PCI地址空间中的共享内存。
问题在于,当您添加更多卡时,PCI地址空间可能会发生变化。 如果您使用PCI自动配置,基本上让vxWorks为您分配地址。我不确定分配顺序,但我认为地址空间是按PCI总线上检测到的设备顺序分配的。
让我们看看我是否可以说明:
PCI Address 3 Devices 4 Devices (Added 1) 0x80000000 (base) +------------------+ +---------------------+ | Host Bridge | | Host Bridge | | Device (0,0,0) | | Device (0,0,0) | | 0x01000000 size | | 0x01000000 size | 0x81000000 +------------------+ +---------------------+ | Slave 1 | | Slave 1 | | Device (0,4,0) | | Device (0,4,0) | | 0x01000000 size | | 0x01000000 size | 0x82000000 +------------------+ +---------------------+ | Slave 2 | | CPCI Card | | Device (0,8,0) | | Device (0,6,0) | | 0x01000000 size | | 0x01000000 size | 0x83000000 +------------------+ +---------------------+ | Slave 2 | | Device (0,8,0) | | 0x01000000 size | +---------------------+
设备元组表示(总线#,设备号,功能#)。 设备#由插入PCI卡的插槽决定。多个PCI总线的可能性以及处理事件的顺序可能会变得复杂。
使用PCI Auto配置时,您可以指定PCI内存窗口的基本地址和大小(有多个可能的PCI内存窗口)。 然后代码进入PCI总线并检测设备。在检测到设备时,它会告诉PCI系统需要多少内存,系统会映射该设备的PCI窗口内的地址。在我的示例中,所有设备都请求0x01000000的RAM。
当PCI配置是静态且不会更改时,这很有效。 但是,正如我们所看到的,如果我们添加一个新设备(CPCI),那么设备的顺序就会改变,这会导致一些地址也发生变化。
PCI自动配置简化了使用寿命,因为您无需担心提前配置所有设备。他们刚刚被发现 但是,如果配置是可变的,您可能需要手动配置:即提前知道可能可能存在哪些设备并尝试配置它们。一方面,您可以完全控制分配给给定PCI设备的地址。
回到你的问题,你怎么知道地址?如果您可以访问vxWorks shell,则可以使用pciConfigTopoShow(),它应该显示找到的各种PCI设备及其地址空间。