2011-03-01 175 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内核空间的代码,你几乎可以在裸机无论如何,为什么不呢?

相关问题