请问xtang以及论坛的各位大大,关于mmap_device_memory()映射的地址的疑问。

中文QNX 讨论: 欢迎大家灌水,讨论有关QNX 问题。

请问xtang以及论坛的各位大大,关于mmap_device_memory()映射的地址的疑问。

帖子xuehuazhou » 周六 7月 16, 2011 11:41 pm

我要映射一个PCIe设备的memory,用法如下
代码: 全选
mem_mem = mmap_device_memory(NULL,0x800,(PROT_READ|PROT_WRITE),MAP_SHARED|MAP_PHYS,addr_mem);

在单个文件调试的时候,映射完全正常,映射后得的地址为:0x = 0x40100800;映射地址的读写完全没有问题。

可在应用时,调用上述的PCIe源文件的时候,发现映射的地址就不对了,映射出来的地址却为:0xFFFFFFFF,映射地址的无从操作了,报Memory fault (core dumped) 的错误,可pcie的源程序没有任何的改动,一摸一样的。

请问xtang以及各位大大以前遇到过这样的问题么,我被这个问题折磨好久了,就是找不到原因,太不可思议了。
ps. 上述的mmap_device_memory()中的各个参数都是按照定义来设置的。
xuehuazhou
Senior Member
 
帖子: 33
注册: 周一 6月 20, 2011 4:39 pm

Re: 请问xtang以及论坛的各位大大,关于mmap_device_memory()映射的地址的疑问。

帖子xuehuazhou » 周日 7月 17, 2011 5:14 pm

xuehuazhou 写道:我要映射一个PCIe设备的memory,用法如下
代码: 全选
mem_mem = mmap_device_memory(NULL,0x800,(PROT_READ|PROT_WRITE),MAP_SHARED|MAP_PHYS,addr_mem);

在单个文件调试的时候,映射完全正常,映射后得的地址为:0x = 0x40100800;映射地址的读写完全没有问题。

可在应用时,调用上述的PCIe源文件的时候,发现映射的地址就不对了,映射出来的地址却为:0xFFFFFFFF,映射地址的无从操作了,报Memory fault (core dumped) 的错误,可pcie的源程序没有任何的改动,一摸一样的。

请问xtang以及各位大大以前遇到过这样的问题么,我被这个问题折磨好久了,就是找不到原因,太不可思议了。
ps. 上述的mmap_device_memory()中的各个参数都是按照定义来设置的。



初步确定原因,是由于mmap_device_memory()与ThreadCtl( _NTO_TCTL_IO, 0 )之间有一段找到设备以及读取PCIe的地址代码,这段代码不知为何能影响mmap_device_memory()的工作。
目前初步的解决方式在mmap_device_memory()的上一行加上ThreadCtl( _NTO_TCTL_IO, 0 );即可
代码: 全选
rc = ThreadCtl( _NTO_TCTL_IO, 0 );
if (rc ==-1)
{
    return EXIT_FAILURE;
    printf("ThreadCtl Error.\n");
}
mem_mem = mmap_device_memory(NULL,0x800,(PROT_READ|PROT_WRITE),MAP_SHARED,addr_mem);
             

具体的导致这种现象的真正的原因,目前尚未清楚。
xuehuazhou
Senior Member
 
帖子: 33
注册: 周一 6月 20, 2011 4:39 pm

Re: 请问xtang以及论坛的各位大大,关于mmap_device_memory()映射的地址的疑问。

帖子xtang » 周一 7月 18, 2011 7:52 pm

没完全看懂你的问题。

1) mmap_device_memory() 返回 -1 意味着出错,你应该 可以查errno来看看具体出了什么 错。

2) mmap_device_memory() 需要IO特权,也已经说,在执行这函数前,必须先执行 ThreadCtl()。如果你写的是个程序,通常在 main() 里做ThreadCtl(),如果你写的是库,一般是在库里先设一个初始化用的init()函数,在那里做个ThreadCtl()。
xtang
Moderator
 
帖子: 1815
注册: 周五 9月 12, 2003 4:14 am
地址: China

Re: 请问xtang以及论坛的各位大大,关于mmap_device_memory()映射的地址的疑问。

帖子xuehuazhou » 周三 7月 20, 2011 9:09 am

xtang 写道:没完全看懂你的问题。

1) mmap_device_memory() 返回 -1 意味着出错,你应该 可以查errno来看看具体出了什么 错。

2) mmap_device_memory() 需要IO特权,也已经说,在执行这函数前,必须先执行 ThreadCtl()。如果你写的是个程序,通常在 main() 里做ThreadCtl(),如果你写的是库,一般是在库里先设一个初始化用的init()函数,在那里做个ThreadCtl()。

我现在遇到的问题是这样的,
如果下面这样的话,就可以mmap返回正确的地址。
代码: 全选
rc = ThreadCtl( _NTO_TCTL_IO, 0 );/*获取特权*/
if (rc ==-1)
{
    return EXIT_FAILURE;
    printf("ThreadCtl Error.\n");
}
......
(其他一些初始化的代码)
......
rc = ThreadCtl( _NTO_TCTL_IO, 0 );/*第二次获取特权*/
if (rc ==-1)
{
    return EXIT_FAILURE;
    printf("ThreadCtl Error.\n");
}
mem_mem = mmap_device_memory(NULL,0x800,(PROT_READ|PROT_WRITE),MAP_SHARED,addr_mem);


如果是下面这样的话,就mmap返回0xffffffff。

代码: 全选
rc = ThreadCtl( _NTO_TCTL_IO, 0 );/*获取特权*/
if (rc ==-1)
{
    return EXIT_FAILURE;
    printf("ThreadCtl Error.\n");
}
......
(其他一些初始化的代码)
......
mem_mem = mmap_device_memory(NULL,0x800,(PROT_READ|PROT_WRITE),MAP_SHARED,addr_mem);
xuehuazhou
Senior Member
 
帖子: 33
注册: 周一 6月 20, 2011 4:39 pm

Re: 请问xtang以及论坛的各位大大,关于mmap_device_memory()映射的地址的疑问。

帖子xtang » 周三 7月 20, 2011 9:30 am

1) 可以在 mmap_device_memory() 后面加判断,检查出的是什么错。
代码: 全选
 if (mem_mem == (void *)-1) {
        printf("mmap: %d\n", errno);
 }


2) ThreadCtl() 只为当前线程取得特权,你的第一部份和第二部份是在同一线程里吗?

3) 下面这段代码明显有问题。:)
代码: 全选
if (rc ==-1)
{
    return EXIT_FAILURE;
    printf("ThreadCtl Error.\n");
}
xtang
Moderator
 
帖子: 1815
注册: 周五 9月 12, 2003 4:14 am
地址: China

Re: 请问xtang以及论坛的各位大大,关于mmap_device_memory()映射的地址的疑问。

帖子xuehuazhou » 周三 7月 20, 2011 6:05 pm

xtang 写道:1) 可以在 mmap_device_memory() 后面加判断,检查出的是什么错。
代码: 全选
 if (mem_mem == (void *)-1) {
        printf("mmap: %d\n", errno);
 }


2) ThreadCtl() 只为当前线程取得特权,你的第一部份和第二部份是在同一线程里吗?

3) 下面这段代码明显有问题。:)
代码: 全选
if (rc ==-1)
{
    return EXIT_FAILURE;
    printf("ThreadCtl Error.\n");
}

恩,貌似晓得原因了,估计是不在一个线程里面,谢谢xtang.对于3)是不是if里面的语句写反了呢,嘿嘿。是copy :lol:
xuehuazhou
Senior Member
 
帖子: 33
注册: 周一 6月 20, 2011 4:39 pm


回到 四海同心QNX论坛

在线用户

正在浏览此版面的用户:没有注册用户 和 1 位游客

cron