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

Embedded 如何在VxWorks 6.3中计算共享内存锚地址,embedded,shared-memory,vxworks,pci,Embedded,Shared Memory,Vxworks,Pci,我继承了3台SBS(现在的GE Fanuc)C2k单板计算机,它们通过CompactPCI背板连接,需要在它们之间建立并运行共享内存。我的理解是,在前几年,SM\u-ANCHOR\u-adr的值最初是由某人“发现”的,每当PMC被调进或调出时,SM\u-ANCHOR\u-adr的值都会被篡改,直到它再次起作用。这一次,我不想随机戳内存地址,而是想了解这个值是如何产生的 我注意到在VxMP手册中有一个关于如何计算VME地址的描述,给出了内存映射和已知偏移量。我试着在C2k用户手册中查找类似的内存映

我继承了3台SBS(现在的GE Fanuc)C2k单板计算机,它们通过CompactPCI背板连接,需要在它们之间建立并运行共享内存。我的理解是,在前几年,
SM\u-ANCHOR\u-adr
的值最初是由某人“发现”的,每当PMC被调进或调出时,
SM\u-ANCHOR\u-adr
的值都会被篡改,直到它再次起作用。这一次,我不想随机戳内存地址,而是想了解这个值是如何产生的

我注意到在VxMP手册中有一个关于如何计算VME地址的描述,给出了内存映射和已知偏移量。我试着在C2k用户手册中查找类似的内存映射,但没有。(我在board support package中看到的有关PCI自动配置的信息可能与此有关?)

此外,如果有用,请从内核配置中选择相关位:
大师:

从卡:

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共享内存锚地址?

这实际上是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地址3个设备4个设备(新增1个) 0x8000000(基数)+-----------------------++---------------------+ |主桥| |主桥| |装置(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大小| +---------------------+ 设备元组表示(总线、设备、函数)。 设备#由PCI卡插入的插槽决定。再加上多个PCI总线的可能性,事情处理的顺序可能会变得复杂

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

当PCI配置是静态的并且没有改变时,这一点很好地工作。 但是,正如我们所看到的,如果我们添加一个新设备(CPCI),那么设备的顺序就会改变,这会导致一些地址也会改变

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

回到你的问题,你怎么知道地址的?如果您有权访问vxWorks外壳,则可以使用pciConfigTopoShow(),它将显示找到的各种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 | +---------------------+