Domanda

che potrei avere alcune idee sbagliate qui, in modo da portare con me.

ho scritto un programma che cattura immagini da una fotocamera. Sto condividendo la memoria tra la fotocamera e la mia applicazione con mmap come ho trovato nel V4L2 documentazione . Questa grande opera. Ora il mio processore (è DM3730 di TI) ha anche un DSP. Voglio usare il DSP, ma richiede fisico memoria contigua. TI fornisce driver per allocare la memoria. Il mio problema è che in questo momento perdo un sacco di tempo per copiare la memoria mmap'ed nella memoria fisica contigua. C'è un modo per dire mmap che non dovrebbe allocare la memoria in sé, ma che dico mmap alla memoria l'uso che ho allocare.

Per dare un'idea di ciò che sto facendo (. C'è un sacco di codice manca, naturalmente, ma ho attaccato molto vicino alla documentazione V4L2 Spero che questo sia sufficiente per capire il mio problema):

//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);

Dopo che copiano la memoria di memoria non contigua nella memoria contigua, quando il telaio è pronto.

...
//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); 
...

Come ho potuto ottenere i frame nella memoria fisica contigua subito?

È stato utile?

Soluzione

Se non è possibile passare il risultato di Memory_alloc() come primo parametro al vostro mmap() (ad esempio, se si utilizza anche mmap () che renderebbe impossibile la mappa di quella memoria di nuovo), probabilmente si dovrebbe usare un altro flusso di I / O metodo dal href="http://v4l2spec.bytesex.org/spec/capture-example.html" rel="nofollow"> esempio dato IO_METHOD_USERPTR. Utilizza lo stesso ioctl come IO_METHOD_MMAP ai telai di cattura e dovrebbe fornire l'efficienza simile.

Altri suggerimenti

Si avrebbe bisogno di supporto dei driver dal driver della fotocamera. mmap ottiene i pagine fisiche che le mappe da qualsiasi driver di essa la mappatura - la fotocamera in questo caso. Non si può dire mmap di utilizzare alcune pagine pre-assegnati, perché il driver di fondo dovrebbe essere detto di usare queste pagine pre-assegnati.

scroll top