Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    [C-POSIX] open, mmap, memcpy

    per ora vi assillo un po ...

    allora sto scrivendo un software per il quale mi serve poter scrivere consumando al minimo il procio e quindi sfruttando al massimo il DMA e le relative accelerazioni MMX e CO ... di conseguenza dopo qualche oretta di ricerca mi pare di aver capito che mappando i file nella memoria virtuale e usando memcpy per copiarci i dati dentro dovrei ottenere maggiori performance, soprattutto tenendo conto che questo applicativo deve fare questa stessa operazione, tipo, per 1 mese di fila, 24 su 24 ore ^^

    posto il pezzetto di codice che mi va in tilt

    codice:
            if (video_read_frame_start(buffer) == TRUE)
            {
                char filename[30];
                sprintf(filename, "./shots/shot.%09i.yuyv", frames);
                
                int shot_fd = open(filename, O_RDWR | O_SYNC | O_CREAT | O_TRUNC);
                void* shot_mem_start = mmap(0, (*buffer).length, PROT_READ | PROT_WRITE, MAP_SHARED, shot_fd, (off_t)(*buffer).length);
                
                if (shot_mem_start == MAP_FAILED)
                {
                    perror("mmap");
                }
                else
                {
                    printf("  Frame[%i] Buffer[%i/%i]: start=%u, length=%i\n", frames, (*buffer).index, n_buffers - 1, (uint)buffers[(*buffer).index].start, (*buffer).length); fflush(stdout);
                    memcpy(shot_mem_start, buffers[(*buffer).index].start, (*buffer).length);
                    munmap(shot_mem_start, (*buffer).length);
                }
                close(shot_fd);
                
                frames++;
            }
            else
            {
                printf("  Frame[%i]: error while reading buffer", frames); fflush(stdout);
            }
            
            // End frame reading
            video_read_frame_end(buffer);
    la riga in grassetto è quella che mi da errore per via SICURAMENTE dell'errato mmap eseguito sul file (se provo a fare un bel printf("%c", *(char *)shot_mem_start); mi da errore)

    l'errore che ricevo è Bus Error ... ergo leggo oltre e mi da problemi

    io credo che la cosa dipenda dal fatto che il file ha una dimensione di zero e col tutto che imposto la dimensione dell'mmap su quello che mi serve scriverci lui continua a tenere zero.

    comunque l'mmap non fallisce

    non essendo molto esperto di programmazione C e dato che per la prima volta mi sono avventurato con mmap/munmap/memcpy che fa potreste darlo un'aiutino?

    ho già cercato estensivamente su internet, mi sono letto parecchio codice sorgente ed ovviamente le manpages sotto linux ... ma non sono riuscito a risolvere

    cmq se non è che imposta la dimensione in memoria a zero forse è perché non rispetto la dimensione della pagina (e quindi la prende a male)

    ho anche provato a fare prima mmap e poi a ridimensionare il tutto con mremap ma ottengo lo stesso identico errore

    qualcuno di voi sa aiutarmi?

  2. #2
    do un piccolo update....


    ho corretto il calcolo della memoria virtuale da allocare per l'mmap ma ancora nun va :\

    la riga corretta è questa
    void* shot_mem_start = mmap(0, (((*buffer).bytesused / sz) + 1) * sz, PROT_READ | PROT_WRITE, MAP_SHARED, shot_fd, 0);


    sz lo estraggo usando
    long sz = sysconf(_SC_PAGESIZE);

    ho bisogno di appena 151 pagine per mettere in memoria i dati

    nota: OVVIAMENTE il problema persiste ancora ma almeon un pezzetto ora è risolto ^^

  3. #3
    risolto

    dovevo usare ftruncate sull'fd del file per riallaggarlo a sufficenza per poterci copiare i file ... credevo che mmap lo facesse da solo

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.