Oppure

Loading
19/11/15 17:21
Roby94
Buonasera, Mentre scrivevo un programma di gestione per un sensore con protocollo I2C ho notato una mancanza che non ho approfondito in una mia libreria per la gestione del modulo UART di un AVR. In poche parole se devo inviare n byte e il buffer di trasmissione dispone di spazio libero sufficiente per n byte non mi pongo problemi, carico tutti i byte nel buffer e lascio che sia l'HW a gestire il tutto, però se invece mi trovassi nella situazione di non poter caricare tutti e n i byte contemporaneamente nel buffer quale sarebbe secondo voi la strategia migliore? carico tutti i byte che posso nel buffer e a loop rimango in attesa che venga prelevato un byte, carico un byte e via cosi fino all'esaurimento degli n byte, oppure sarebbe meglio riempire il buffer, aspettare che si svuoti del tutto e riempirlo di nuovo?
Il buffer è di tipo circolare con una gestione totalmente software.
Attendo vostri pareri, grazie.
aaa
19/11/15 19:18
pierotofy
In linea generale (senza conoscere le specifiche dell'hardware che stai gestendo) trasmettere dati in "chunks" (blocchi) è più efficiente che trasmettere bytes uno ad uno. Quindi direi aspetta che si svuoti e poi riempilo di nuovo.
Il mio blog: piero.dev
20/11/15 20:11
Roby94
D'accordo con te Piero, ho modificato di conseguenza la libreria cosi
void UARTTxArray(const uint8_t array[], uint16_t n)
{
	do {		
		while(BufferFreeSpace(&UARTTxBuffer) < n && !BufferIsEmpty(&UARTTxBuffer));//Attendo che nel buffer vi sia spazio sufficiente per tutti i byte o che sia completamente vuoto
		
		UARTTxInterruptDisabled();//Disabilito l'interrupt per la conclusione di invio di un byte
		
		do {
			BufferPush(&UARTTxBuffer, *array);//Inserisco il byte corrente nel buffer di trasmissione
			n--;//Diminuisco di uno i byte da dover ancora inviare
			array++;//Sposto di un byte in avanti il puntatore al byte corrente
		} while(n != 0 && !BufferIsFull(&UARTTxBuffer));//Continuo fintanto che i byte ancora da inviare siano finiti o il buffer di trasmissione sia pieno
		
		UARTTxInterruptEnabled();//Abilito l'interrupt per la conclusione di invio di un byte
		
		UARTSendData();//Rinizio la procedura di invio dei dati
	} while(n != 0);//Rieseguo il ciclo se rimangono ancora byte da inviare
}

Che ne pensi, può essere una valida soluzione? è pensata per un generico AVR, testata e generata per ATmega328P.
Grazie.

Per completezza è possibile trovare il codice completo qua github.com/RobertoBochet/AVR-Libraries-C/blob/master/UART/…
aaa
28/11/15 16:07
pierotofy
Mi sembra a posto!
Il mio blog: piero.dev