Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何处理使用36位映射的IO?_C++_C_Linux_Memory_Memory Management - Fatal编程技术网

C++ 如何处理使用36位映射的IO?

C++ 如何处理使用36位映射的IO?,c++,c,linux,memory,memory-management,C++,C,Linux,Memory,Memory Management,我有一块板,上面有一个APM86290(ppc)SOC。这是我第一次尝试这种类型的开发,我正在尝试使用SPI控制器,该控制器使用36位地址映射(根据数据表)。我想使用mmap()和/dev/mem读取一些寄存器。通常有一种统一的方法来处理这些高位吗?或者这可能是特定于此处理器/的某种情况?这就是我现在试图做的 #define OFFSET 0xfa0000000 int main() { int i; unsigned int * someRegister; int

我有一块板,上面有一个APM86290(ppc)SOC。这是我第一次尝试这种类型的开发,我正在尝试使用SPI控制器,该控制器使用36位地址映射(根据数据表)。我想使用
mmap()
/dev/mem
读取一些寄存器。通常有一种统一的方法来处理这些高位吗?或者这可能是特定于此处理器/的某种情况?这就是我现在试图做的

#define OFFSET 0xfa0000000 

int main()
{
    int i;
    unsigned int * someRegister;

    int fd = open("/dev/mem",O_RDWR|O_SYNC);
    if(fd < 0)
    {
            printf("Can't open /dev/mem\n");
            return 1;
    }
    someRegister = (unsigned int *) mmap(0, sizeof(int), PROT_READ|PROT_WRITE, MAP_SHARED, fd, OFFSET);
    if(someRegister <= NULL)
    {
            printf("Can't mmap\n");
            return 1;
    }
    else
    {
            printf("register=%x\n",OFFSET);
            printf("contents=%x\n",*someRegister);
    }

    return 0;
}

显示我期望的36位值。

这在很大程度上取决于您的设置。您可以尝试使用64位版本的mmap()。如果这对您不起作用,您可能需要为每个36位寄存器映射一个上寄存器和下寄存器。

mmap64()似乎正在检索我想要的内容。我一天中大部分时间都在用头撞墙。。。谢谢@安迪:FWIW,谷歌搜索
“36位”mmap
在第一页多次提出这个建议。;-]
effff8000-effffffff : ocm_mem
fa0000000-fa000001f : serial