如何在VxWorks 6.3中计算共享内存锚地址

时间:2011-04-28 00:29:51

标签: embedded shared-memory vxworks pci

我继承了通过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的共享内存锚地址?

1 个答案:

答案 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设备及其地址空间。