2016-08-06 104 views
3

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 mit
vma->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.

+1

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

+0

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

+1

wird "Adresse" als "flüchtig" deklariert? – pah

Antwort

1

Nach dem, was in der Frage Kommentare diskutiert wurde, der address Zeiger hier zugeordnet werden:

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

wurde nicht mit dem Qualifier volatile erklärt, so dass der Compiler Annahmen über sie vorzuformen, um potenzielle führenden kompilieren Sie Zeitoptimierungen über die Lese-/Schreiboperationen.