vxWorks 6.8 将物理内存映射到虚拟内存

发布于 2024-10-19 21:53:13 字数 641 浏览 4 评论 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());
}

任何帮助将非常感激, 谢谢,

摩西。

This is my first question here :).

I been trying for while now to map physical memory to virtual memory in vxWorks 6.8 with no success,
I'm trying to use "vmMap" function but somehow it keeps return with:

errno = 0x30065 S_taskLib_NAME_NOT_FOUND.

my code is:

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());
}

Any help will be very appreciate,
thanks,

Moshe.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

☆獨立☆ 2024-10-26 21:53:13

我看到你很久以前就已经解决了这个问题,但我想我会为其他可能在昏暗和黑暗中绊倒的人留下一些面包屑。遥远的未来..

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

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

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

I see you already solved this long ago, but thought I'd leave some bread crumbs for whoever else might stumble this way in the dim & distant future..

Unless you're doing RTPs there's a good chance your MMU isn't even translating addresses. I.e., if something appears at say, 0x7fc00400 in the physical address space, you could simply cast that value to a pointer and use it.

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

And Yes, these days it is almost sacrilege to suggest (ab)using pointers this way, but I would point out that if you're doing vxworks kernel space code, you're practically on the bare metal anyway, so why not?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文