mmap mémoire physiquement contiguë

j'ai peut-être quelques idées fausses ici, alors soyez indulgents.

j'ai écrit un programme qui capture des images d'une caméra. Je partage la mémoire entre la caméra et mon application avec mmap comme je l'ai trouvé dans le V4L2 documentation. Cela fonctionne très bien. Maintenant, mon processeur (C'est le DM3730 de TI) a aussi un DSP. Je veux utiliser le DSP, mais il requiert moins de!--8-->physique mémoire contiguë. TI fournit des pilotes pour allouer la mémoire. Mon problème est que maintenant je perdre beaucoup de temps à copier la mémoire mmap'ed dans la mémoire physique contiguë. Y a-t-il un moyen de dire à mmap qu'il ne doit pas allouer la mémoire elle-même, mais que je dis à mmap d'utiliser la mémoire que j'alloue.

pour vous donner une idée de ce que je fais (il y a beaucoup de code manquant bien sûr, mais je suis resté très proche de la documentation V4L2. J'espère que c'est assez pour comprendre mon problème):

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

après cela je copie la mémoire hors de la mémoire non-contiguë dans la mémoire contiguë, chaque fois qu'un cadre est prêt.

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

Comment pourrais-je obtenir les images dans la mémoire physique contiguë tout de suite?

10
demandé sur Lucas 2011-11-28 22:41:53

2 réponses

si vous ne pouvez pas passer le résultat de Memory_alloc() comme premier argument à votre mmap() (par exemple, si elle utilise aussi mmap () qui rendrait impossible de mapper à nouveau cette mémoire), vous devriez probablement utiliser une autre méthode d'entrée/sortie en continu de exemple -IO_METHOD_USERPTR variation. Il utilise le même ioctl comme IO_METHOD_MMAP pour capturer les cadres et devrait fournir l'efficacité similaire.

3
répondu praetorian droid 2011-11-28 22:28:25

Vous auriez besoin de l'aide du pilote de la caméra. mmap obtient les pages physiques qu'il cartographie à partir de n'importe quel pilote il cartographie - la caméra dans ce cas. Vous ne pouvez pas dire à mmap d'utiliser certaines pages pré-attribuées, parce que le pilote sous-jacent devrait être averti d'utiliser ces pages pré-attribuées.

2
répondu bdonlan 2011-11-28 19:36:15