Sto lavorando su un semplice stack di protocollo per un piccolo sistema embedded (roba di tipo multidrop, rs485). In questo stack, modelli losely dopo livelli OSI:Come gestire al meglio i buffer di grandi dimensioni in uno stack di protocolli con livelli?
- applicazione
- rete
- Datalink
- fisico (driver seriale)
Ogni strato ha la propria parte di intestazione/piè avvolge il carico utile dello strato sopra di esso.
Utilizzerò il mio pool di buffer di blocchi di dimensioni fisse allocati staticamente per archiviare i pacchetti binari. (No malloc/free in questa app.)
In altre API ho visto che i dati vengono solitamente passati come puntatore const con una lunghezza associata. In questo modo i dati necessiterebbero di un'operazione di copia su ciascun livello, in quanto il carico utile del livello precedente viene collocato in un buffer appena assegnato per il livello corrente.
Per uno stack a tre livelli ci sarebbero 2 operazioni di copia e 3 buffer allocati.
Esiste un modo migliore per eseguire questa operazione mantenendo una separazione netta dei livelli del protocollo?
Per ancorare meglio la discussione, diciamo che i pacchetti sono in genere intorno a 2k e il processore è un piccolo micro 8 bit che gira a 8Mhz.
8bit micro @ 8Mhz ee 2kB pacchetto? Non hai menzionato la ram disponibile, ma immagino che il pacchetto lo riempia e il tuo chiaramente eseguendo un "singolo processo" credo non riesca a vedere il motivo per creare così tanti livelli e astrazioni per un sistema così semplice. infrangerlo in "trasmissione dati" e "applicazione" e passare il carico utile tramite un puntatore a un globale. – Mark
@Mark, lo stack di protocollo deve essere utilizzato su piattaforme diverse, uno è un Atmega1281 con 8k ram. Può essere sincronizzato a 20 Mhz, ma non lo facciamo per motivi di potenza. Potrei rilassare la separazione delle preoccupazioni ma non è questo il punto della mia domanda. – JeffV
@Mark, hai ragione riguardo al buffer 2k, molto probabilmente non sarò in grado di andare così grande, ma per questa app tanto più grande quanto migliore è il canale dati ad alta latenza (satellite) e non ho intenzione di aggiungere windowing (come si fa con TCP). – JeffV