Как вычислить адрес привязки к разделяемой памяти в VxWorks 6.3 - PullRequest
0 голосов
/ 28 апреля 2011

Я унаследовал 3 одноплатных компьютера SBS (теперь GE Fanuc) C2k, подключенных через объединительную плату CompactPCI, и мне необходимо настроить и использовать совместно используемую память.Насколько я понимаю, в предыдущие годы значение для SM_ANCHOR_ADRS первоначально было кем-то «найдено», и всякий раз, когда PMC менялись или исчезали, значение для SM_ANCHOR_ADRS менялось до тех пор, пока оно не заработало снова.На этот раз вместо того, чтобы случайным образом указывать адреса памяти, я хотел бы узнать, как это значение начинается с самого начала.

Я заметил, что в руководстве по VxMP есть описание того, как вычислить этот адрес дляVME, учитывая карту памяти и известные смещения.Я попытался найти похожую карту памяти в руководстве пользователя C2k, и ни одна не существует.(Биты об автоконфигурации PCI, которые я видел в пакете поддержки платы, могут иметь к этому какое-то отношение?)

Кроме того, если это полезно, соответствующие биты из конфигурации ядра:
Master:

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  

С этой информацией, как бы я мог вычислить адрес привязки общей памяти для VxWorks для устройств на объединительной плате CompactPCI?

1 Ответ

2 голосов
/ 28 апреля 2011

Это действительно функция архитектуры шины 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    |
                                            +---------------------+

Кортеж устройства представляет (Bus #, Device #, Function #).Device # определяется тем, к какому слоту подключена карта PCI. Добавьте возможность использования нескольких шин PCI, и порядок обработки может усложниться.

При использовании конфигурации PCI Auto вы указываетебазовый адрес и размер окон памяти PCI (возможны несколько окон памяти PCI).Затем код отправляется на шину PCI и обнаруживает устройства.Когда устройство обнаружено, оно сообщает системе PCI, сколько памяти ему нужно, и система отображает адреса в окне PCI для этого устройства.В моем примере все устройства запрашивали 0x01000000 оперативной памяти.

Это хорошо работает, когда конфигурация PCI статическая и не изменяется.Однако, как мы видим, если мы добавим новое устройство (CPCI), то порядок устройств изменится, что также приведет к изменению некоторых адресов.

Автоконфигурирование PCI упрощает жизнь, так как вы не используетеНе нужно беспокоиться о настройке всех устройств заранее.Они только что обнаружены.
Однако, если конфигурация переменная, вам, вероятно, нужно настроить вещи вручную: т.е. заранее знать, какие устройства могут присутствовать, и попытаться настроить их.С другой стороны, у вас есть полный контроль над тем, какой адрес вы назначаете данному PCI-устройству.

Чтобы вернуться к вашему вопросу, откуда вы знаете этот адрес?Если у вас есть доступ к оболочке vxWorks, вы можете использовать pciConfigTopoShow (), которая должна показать вам различные найденные устройства PCI и их адресные пространства.

...