Frage

Ich könnte hier einige Missverständnisse haben, also tragen Sie es mit mir.

Ich habe ein Programm geschrieben, das Bilder von einer Kamera aufnimmt. Ich teile den Speicher zwischen der Kamera und meiner Anwendung mit mmap Wie ich in der gefunden habe V4L2 -Dokumentation. Das funktioniert großartig. Jetzt hat mein Prozessor (es ist TIs DM3730) auch einen DSP. Ich möchte den DSP verwenden, aber es erfordert physisch zusammenhängender Speicher. TI liefert den Fahrern, um den Speicher zuzuweisen. Mein Problem ist, dass ich im Moment viel Zeit verliere, um das MMAP -Gedächtnis in das physische zusammenhängende Gedächtnis zu kopieren. Gibt es eine Möglichkeit, MMAP mitzuteilen, dass es nicht selbst Speicher zuweisen sollte, sondern dass ich MMAP sage, dass ich den Speicher verwenden soll, den ich zuweisen?

Um Ihnen eine Vorstellung davon zu geben, was ich tue (es fehlt natürlich viel Code, aber ich bin der V4L2 -Dokumentation sehr nahe geklebt. Ich hoffe, das ist genug, um mein Problem zu verstehen):

//reserve physical contiguous memory
dsp_buffer      = Memory_alloc(buffer_length, &myParams); 

...
//reserve memory for buffer, but not contiguous
buffers[n_buffers].start =
     mmap (NULL ,                    /* start anywhere */
     buf.length,
     PROT_READ | PROT_WRITE ,  /* required */                               
     MAP_SHARED ,              /* recommended */
     fd, buf.m.offset);

Danach kopiere ich den Speicher aus dem nicht zusammenhängenden Speicher in den zusammenhängenden Speicher, wenn ein Frame fertig ist.

...
//wait until frame is ready in memory
r = select (fd + 1, &fds, NULL, NULL, &tv); 
...
//copy the memory over to the physically contiguous memory
memcpy(dsp_buffer,buffers[buf.index].start,size); 
...

Wie könnte ich die Frames sofort in den physischen angrenzenden Gedächtnis bringen?

War es hilfreich?

Lösung

Wenn Sie das Ergebnis von nicht bestehen können Memory_alloc() als erstes Argument für Ihr mmap() (Wenn es beispielsweise auch MMAP () verwendet, würde es es unmöglich machen, diesen Speicher erneut zuzuordnen), sollten Sie wahrscheinlich eine andere Streaming -E/A -Methode aus dem verwenden gegebenes Beispiel - IO_METHOD_USERPTR Variation. Es verwendet das gleiche ioctl als io_method_mmap zum Erfassen von Frames und sollte ähnliche Effizienz liefern.

Andere Tipps

Sie würden den Fahrerunterstützung vom Kameratreiber benötigen. mmap Erhält die physischen Seiten, die es von jedem Treiber erstellt, den er abgebildet hat - die Kamera in diesem Fall. Sie können MMAP nicht sagen, dass sie einige vorab allozierte Seiten verwenden soll, da der zugrunde liegende Fahrer angewiesen werden müsste, diese vorab erneuerten Seiten zu verwenden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top