Una soluzione potrebbe essere quella di implementare il proprio sprintf
che è in grado di funzionare con i buffer dell'anello. Sfortunatamente questo non ti aiuterà a risolvere un problema di base: cosa faresti se il tuo RingBuffer è pieno e invochi sprintf
?
Se la vostra situazione memoria può permettere, io suggerirei di un'altra soluzione per questo problema:
L'idea si basa su due liste collegate di buffer (una lista dei buffer liberi, un elenco come coda di trasmissione) . I buffer sono ugualmente dimensionati in modo da poter memorizzare una stringa di lunghezza peggiore. I buffer costruiscono un semplice heap in cui allocazione/deallocazione non fa altro che dequeuing/enqueuing di un elemento sia dal libero sia dall'elenco di trasmissione.
Avere buffer di dimensioni uguali garantisce di non soffrire di effetti di frammentazione esterni come "scacchiera" mentre si assegna dinamicamente la memoria. Costruire il proprio heap per questo lavoro ti darà anche il pieno controllo sulla dimensione totale del buffer disponibile per le attività di trasmissione.
potevo immaginare questo correre come segue:
- di allocare un buffer dalla lista libera di rendere i dati in.
- Usa il render funzioni (suchas sprintf) per rendere i dati nel buffer
- aggiungere i dati devono essere inviati alla coda di trasmissione (e innescare una trasmissione se necessario)
Per il DMA trasferirà gestire l'IRQ di trasferimento. Qui si sposta il buffer appena trasferito alla "lista libera" e si imposta il trasferimento per il buffer successivo nella coda.
Questa soluzione non sarà la memoria più efficiente, ma l'efficienza di runtime è buona poiché si scrive una sola volta nella memoria e l'allocazione/deallocazione sta solo recuperando/memorizzando un puntatore da qualche parte. Ovviamente dovrai assicurarti di non ottenere condizioni di gara tra la tua domanda e l'IRQ per l'allocazione/deallocazione.
Forse questa idea ti dà l'ispirazione per risolvere le tue esigenze.
Requisito interessante, ma non credo che si possa fare molto meglio di 'formattazione in buffer temporaneo seguito da copia su buffer circolare con funzione di copia appropriata'. –