필자는 FPGA에서 디바이스를 petalinux로 드라이버를 작성하고 사용자 공간에서 디바이스를 제어하기 위해 mmap 함수를 구현했다. 내 문제는,이 캐시가 활성화 된 것 같다 내가 mmap에 기능에mmap()을 사용할 때 캐싱을 피하는 방법
vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
및 사용자 응용 프로그램에서 MAP_SHARED
플래그를 사용하고 또한 경우이다.
테스트는 실제로 AXI 버스에서 오는 데이터의 최하위 비트만 저장하는 mmaped 장치의 특정 레지스터에 값 (5)을 쓰는 것입니다. 쓰기 작업 후 즉시 읽으면 1이됩니다 (Microblaze에서 베어 메탈 응용 프로그램을 사용하는 경우 발생). 대신 5를 읽습니다. 그러나 값은 올바르게 기록됩니다. ..happens.
미리 감사드립니다.
코드에서 mmap'd 영역을 정확히 액세스 (쓰기/읽기)하고 있습니까? 특히, 특정 레지스터를 쓰거나 읽는 방법에 대한 코드 스 니펫을 제공 할 수 있습니까? – pah
내 응용 프로그램에서 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
은'volatile'로 선언 된'address'입니까? – pah