vxWorks 6.8 отображает физическую виртуальную память - PullRequest
0 голосов
/ 01 марта 2011

Это мой первый вопрос здесь:).

Я пытался сопоставить физическую память с виртуальной памятью в vxWorks 6.8, но безуспешно, Я пытаюсь использовать функцию "vmMap", но каким-то образом она продолжает возвращаться с:

errno = 0x30065 S_taskLib_NAME_NOT_FOUND.

мой код:

int page_size=0;
PHYS_ADDR GPIO_BASE_VIRTUAL_ADDR = 0x40E00000;
VIRT_ADDR VIRTUAL_ADDR=0;

page_size =vmPageSizeGet();
if((VIRTUAL_ADDR = (VIRT_ADDR)memalign(page_size,page_size*2))==NULL)// allocate 2 pages 
{
    printf("error in memalign() errno = 0x%x\n",errnoGet());
}

if(vmMap(NULL,VIRTUAL_ADDR,GPIO_BASE_VIRTUAL_ADDR,(page_size*2))== ERROR )
{
    printf("Error mapping memory errno = 0x%x%\n",errnoGet());
}

Любая помощь будет очень признателен, спасибо,

Моше.

1 Ответ

0 голосов
/ 31 мая 2012

Я вижу, вы уже решили это давно, но подумали, что я оставлю несколько хлебных крошек для тех, кто еще может споткнуться таким образом в смутном и отдаленном будущем.

Если вы не выполняете RTP, естьВероятно, ваш MMU даже не переводит адреса.Т.е., если что-то появляется, скажем, 0x7fc00400 в физическом адресном пространстве, вы можете просто привести это значение к указателю и использовать его.

*((short *) 0x7fc00400) = foo; // write 16 bits!

И да, в наши дни почти кощунственно предлагать (ab) использовать указатели таким образом, но я хотел бы отметить, что если вы делаете код пространства ядра vxworks, вы практически наголый металл в любом случае, так почему бы и нет?

...