2011-03-01 180 views
0

這是我的第一個問題:)。vxWorks 6.8將物理映射到虛擬內存

我一直試圖趁現在身體內存在VxWorks的6.8,但沒有成功映射到虛擬內存, 我試圖用「的VMMap」功能,但不知何故,它不斷與回報:

錯誤號= 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()); 
} 

任何幫助會非常感激,感謝 ,

卡察夫。

+0

你知道了嗎?某些vxWorks函數在失敗時不會設置errno,因此您可以在調用函數來檢查errno是否確實來自vmMap之前將其設置爲0。 – 2011-04-01 20:12:38

+0

嗨, 是的,我在BSP \t {/ * MAP GPIO */ 的sysLib.c中的文件解決它, 以同樣的方式對兩個地址(0x160 ...和0x40E ....) \t(到virt_addr_size)0x40E00000,/ *虛擬地址*/ \t(PHYS_ADDR)0x40E00000,/ *物理地址*/ \t爲0x1000,\t \t \t \t \t \t/*長度,則初始狀態:*/ \t VM_STATE_MASK_VALID | VM_STATE_MASK_WRITABLE | VM_STATE_MASK_CACHEABLE, \t VM_STATE_VALID | VM_STATE_WRITABLE | VM_STATE_CACHEABLE_NOT \t}, 和虛擬與需要「的分配大小」和, 所使用的指針所請求的地址爲「平坦」,就像是與所需要的偏移量。 – 2011-04-12 14:56:53

回答

0

我看你已經解決了這個很久以前,但認爲我會離開一些麪包屑的不管是誰可能在昏暗的&遙遠的未來絆倒這樣..

除非你做的RTP有一個很好的很可能你的MMU甚至沒有翻譯地址。也就是說,如果物理地址空間中出現0x7fc00400之類的東西,你可以簡單地將該值轉換爲指針並使用它。

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

是的,這些天幾乎是褻瀆建議(AB)使用指針這種方式,但我想指出的是,如果你正在做VxWorks內核空間的代碼,你幾乎可以在裸機無論如何,爲什麼不呢?

相關問題