2014-09-04 3 views
1

일부 레지스터를 읽고 쓰는 데 mmap을 사용하는 방법을 배우려고합니다. 다음 코드가 있습니다. 나는 문제가 있어요mmap을 사용하여 읽기/쓰기 레지스터

readback = *((volatile unsigned long *) (mapped_LED_base)); 

읽기

*((volatile unsigned long *) (mapped_LED_base)) = 0xFFFFF; 

그리고 :

#define MY_BASE_ADDRESS 0xC0000000 //Base Address for the PCIe 
#define LED_ADDRESS  0x00010000 //Offset for LEDS 0x00010000 
#define MAPPED_FILE_SIZE (50 * sizeof(int)) //Guess 
#define PAGE_SIZE (sysconf(_SC_PAGESIZE)); 

void *mapped_region, *mapped_LED_base; 

off_t dev_base = ( MY_BASE_ADDRESS | LED_ADDRESS); 
unsigned long readback = 0; 

먼저 나는

//The O_SYNC option prevents Linux from caching the contents of /dev/mem 
memoryFileDescriptor = open("/dev/mem", O_RDWR | O_SYNC); 
    if (memoryFileDescriptor == -1) 
     { 
     printf("Can't open /dev/mem. %d\n", memoryFileDescriptor); 
     exit(0); 
     } 

// Map one page of memory into user space such that the device is in that page, but 
//it may not 
// be at the start of the page. 
mapped_region = mmap(NULL, 
        MAPPED_FILE_SIZE, //How to know size? 
        PROT_READ | PROT_WRITE, 
        MAP_SHARED, //File may not be updated until msync or munmap is 
                      // called. 
        memoryFileDescriptor, 
        dev_base); //How to know the offset? 

// get the address of the device in user space which will be an offset from the base 
// that was mapped as memory is mapped at the start of a page 
mapped_LED_base = mapped_region + dev_base; 

그럼 내가 주소로 작성합니다은/dev/MEM을 엽니 다 MAP_SIZE 및 그 오프셋을 알고 있습니까? 그 문서는 그렇게 명확하지 않았습니다. 현재 코드가 세그먼트 오류 오류를 발생시킵니다.

내가 리눅스를 사용하고 있습니다 및 C++

답변

0

이 크기는 그래서 현재 당신이 50 X 32 비트 레지스터를 가지고 말, 하드웨어의 레지스터의 크기입니다. 실제로이 숫자는 아키텍처의 페이지 크기 (일반적으로 4KB)로 반올림됩니다.

부호없는 long 레지스터가 하나있는 경우 sizeof(unsigned long)으로 설정해야합니다. 시스템이 실제로 4KB로 "증가"하더라도 실제로 필요한 것보다 많이 매핑하면 안됩니다.

+0

dev_base가 올바른 오프셋입니까? 이것은 mmap이 시작될 주소를 의미합니까? – user1876942

+0

매핑이 시작되는 파일 내의 주소, 예. 실제로 mmap에서 돌아온 포인터가 -1 (의미 오류)이 아닌지 확인 했습니까? –

+0

예, mmap이 -1을 반환하지 않습니다. 그래서 dev/mem을 열고 dev_base 주소에서 50 * ints 길이로 매핑을 시작합니다. 그 주소는 정확하고 왜 충돌하는지 모르겠다. – user1876942