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?