В VxWorks 7 предпочтительным способом является реализация драйвера устройства vxbus.Внутри драйвера у вас будет фрагмент кода, который выглядит примерно так;в зависимости от того, сколько регистров базовых адресов PCI вас интересует.
for (i = 0; i < VXB_MAXBARS; i++)
{
pRes = vxbResourceAlloc (pDev, VXB_RES_MEMORY, i);
if (pRes != NULL)
{
pResAdr = (VXB_RESOURCE_ADR *)pRes->pRes;
if (pResAdr != NULL)
{
pDrvCtrl->resource[i].handle = pResAdr->pHandle;
pDrvCtrl->resource[i].base = (void *)pResAdr->virtual;
pDrvCtrl->resource[i].res = pRes;
break;
}
else
{
(void) vxbResourceFree (pDev, pRes);
}
}
}
Позже вы будете использовать vxbRead32 и / или vxbWrite32 с ресурсом [i] .handle и pDrvCtrl-> resource [i] .base.параметры для указания того, к какому ресурсу базового адреса вы хотите получить доступ, и специфический для архитектуры путь / механизм доступа к ресурсу.
Обычно вас не интересует фактическое значение виртуального адреса, но виртуальный адрес можетбыть известным путем проверки членов структуры данных VXB_RESOURCE_ADR.В этом примере pDrvCtrl-> resource [i] .base содержит значение виртуального адреса.
Чистый результат состоит в том, что vxbResourceAlloc автоматически заботится о привязке физического / виртуального адреса к архитектуре / плате и отслеживаетзначения для вас.