0

这是我在这里的第一个问题:)。

我一直在尝试将物理内存映射到 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());
}

任何帮助将不胜感激,谢谢,

莫舍。

4

1 回答 1

0

我看到你很久以前就已经解决了这个问题,但我想我会留一些面包屑给在昏暗而遥远的未来可能会以这种方式绊倒的人。

除非您正在执行 RTP,否则您的 MMU 很有可能甚至没有翻译地址。即,如果出现在物理地址空间中的 0x7fc00400 处,您可以简单地将该值转换为指针并使用它。

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

是的,现在建议(ab)以这种方式使用指针几乎是一种亵渎,但我要指出,如果您正在执行 vxworks 内核空间代码,那么您实际上是在裸机上,为什么不呢?

于 2012-05-31T18:58:15.843 回答