2016-08-06 5 views
3

필자는 FPGA에서 디바이스를 petalinux로 드라이버를 작성하고 사용자 공간에서 디바이스를 제어하기 위해 mmap 함수를 구현했다. 내 문제는,이 캐시가 활성화 된 것 같다 내가 mmap에 기능에mmap()을 사용할 때 캐싱을 피하는 방법

vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); 

및 사용자 응용 프로그램에서 MAP_SHARED 플래그를 사용하고 또한 경우이다.

테스트는 실제로 AXI 버스에서 오는 데이터의 최하위 비트만 저장하는 mmaped 장치의 특정 레지스터에 값 (5)을 쓰는 것입니다. 쓰기 작업 후 즉시 읽으면 1이됩니다 (Microblaze에서 베어 메탈 응용 프로그램을 사용하는 경우 발생). 대신 5를 읽습니다. 그러나 값은 올바르게 기록됩니다. ..happens.

미리 감사드립니다.

+1

코드에서 mmap'd 영역을 정확히 액세스 (쓰기/읽기)하고 있습니까? 특히, 특정 레지스터를 쓰거나 읽는 방법에 대한 코드 스 니펫을 제공 할 수 있습니까? – pah

+0

내 응용 프로그램에서 mmaped 영역에서 쓰거나 읽을 때'* (unsigned int *)를 사용하고 있는데 (address = mmap (NULL, PAGE_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); ' 주소 + REG_OFFSET) = 5'와'temp_var = * (부호없는 int *) (주소 + REG_OFFSET)'. – Alessandro

+1

은'volatile'로 선언 된'address'입니까? – pah

답변

1

질문 코멘트에서 논의 있었는지는 address 포인터가 여기에 할당되는 기준 자료 :

address = mmap(NULL, PAGE_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); 

잠재적으로 이어지는, 컴파일러는 그 위에 가정을 미리 형성 할 수 있도록 타입 한정자 volatile로 선언되지 않았습니다 읽기/쓰기 작업보다 컴파일 시간 최적화를 수행합니다.