Pregunta

He heredado las computadoras de una sola placa SBS (ahora GE FANUC) C2K conectadas a través de un plano de retroceso CompactPCI, y necesito que la memoria compartida se ejecute entre ellas. Entiendo que en años anteriores, el valor para SM_ANCHOR_ADRS inicialmente fue "encontrado" por alguien, y cada vez que los PMC se intercambiaron o salían el valor de SM_ANCHOR_ADRS fue juguetón hasta que funcionó nuevamente. Esta vez, en lugar de hacer las direcciones de memoria al azar, me gustaría aprender cómo se trata de comenzar este valor.

He notado en el manual de VXMP que hay una descripción de cómo calcular esta dirección para VME, dado un mapa de memoria y compensaciones conocidas. He intentado buscar un mapa de memoria similar en el manual del usuario de C2K y ninguno existe. (Los bits sobre la configuración automática de PCI que vi en el paquete de soporte de la junta pueden tener algo que ver con eso?)

Además, en caso de que sea útil, bits relevantes de la configuración del núcleo:
Maestro:

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

Tarjetas de esclavos:

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  

Con esta información, ¿cómo haría para calcular la dirección de anclaje de memoria compartida para VXWorks para dispositivos en un plano posterior CompactPCI?

¿Fue útil?

Solución

Esta es realmente una función de la arquitectura del bus PCI y su naturaleza dinámica. El SM_ANCHOR_ADRS representa la memoria compartida en el espacio de dirección PCI de la tarjeta de esclavos.

El problema es que cuando agrega más tarjetas, el espacio de direcciones PCI puede cambiar potencialmente. Si utiliza la configuración automática PCI, esencialmente permite que VXWorks asigne las direcciones. No estoy seguro de la orden de asignación, pero creo que el espacio de direcciones se asigna en los dispositivos de pedido se detectan en el bus PCI.

Veamos si puedo ilustrar:

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    |
                                            +---------------------+

La tupla del dispositivo representa (bus #, dispositivo #, función #). El # del dispositivo está determinado por la ranura que está enchufada la tarjeta PCI. Agregue la posibilidad de múltiples buses PCI y el orden en que se procesan las cosas puede complicarse.

Al usar la configuración automática de PCI, especifica la dirección base y el tamaño de las ventanas de memoria PCI (hay múltiples posibles Windows de memoria PCI). El código luego se encuentra en el bus PCI y detecta los dispositivos. A medida que se detecta un dispositivo, le dice al sistema PCI cuánta memoria necesita y el sistema mapea las direcciones dentro de la ventana PCI para ese dispositivo. En mi ejemplo, todos los dispositivos solicitaron 0x01000000 de RAM.

Esto funciona bien cuando la configuración de PCI es estática y no cambia. Sin embargo, como podemos ver, si agregamos un nuevo dispositivo (el CPCI), entonces el orden de los dispositivos cambió, lo que hace que algunas de las direcciones también cambien.

PCI Autoconfiguration simplifica la vida ya que no tiene que preocuparse por configurar todos los dispositivos con anticipación. Se acaban de descubrir.
Sin embargo, si la configuración es variable, probablemente necesite configurar las cosas manualmente: es decir, con anticipación qué dispositivos puede que estar presente e intentar configurarlos. Uno de la ventaja, tiene control total sobre la dirección que asigna a un dispositivo PCI dado.

Para volver a su pregunta, ¿cómo sabe la dirección? Si tiene acceso al shell VXWorks, puede usar PCICONFIGTOPOSHOW (), que debería mostrarle los diversos dispositivos PCI encontrados y sus espacios de dirección.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top