Ich schreibe einen Treiber in Petalinux für ein Gerät in meinem FPGA und ich habe die mmap-Funktion implementiert, um das Gerät im Benutzerraum zu steuern. Mein Problem ist, dass, auch wenn ichwie zu vermeiden, Zwischenspeicherung bei Verwendung von mmap()
bin mitvma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
in der mmap Funktion und MAP_SHARED
Flagge in der Benutzeranwendung, wie es scheint, dass der Cache aktiviert ist.
Der Test, den ich tat, ist, einen Wert (sagen wir 5) in ein spezifisches Register meines mmaped Gerätes zu schreiben, das wirklich nur das niedrigstwertige Bit der Daten speichert, die vom AXI Bus kommen. Wenn ich unmittelbar nach dem Schreibvorgang lese, erwarte ich 1 (das ist bei Verwendung einer Bare-Metal-Anwendung auf Microblaze passiert), stattdessen lese ich 5. Der Wert ist aber richtig in das Register geschrieben, denn was muss passieren .. ..das passiert.
Vielen Dank im Voraus.
Wie genau greifen Sie auf die mmap'd-Region in Ihrem Code (schreiben/lesen)? Können Sie insbesondere ein Code-Snippet bereitstellen, in dem Sie das spezifische Register, über das Sie sprechen, schreiben/lesen? – pah
In meiner Anwendung verwende ich 'adresse = mmap (NULL, PAGE_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);' beim Schreiben/Lesen aus der Mmap-Region verwende ich '* (unsigned int *) (Adresse + REG_OFFSET) = 5' und 'temp_var = * (unsigned int *) (Adresse + REG_OFFSET)'. – Alessandro
wird "Adresse" als "flüchtig" deklariert? – pah