Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Sistemi integrati - Teoria delle code in buffer UART
Forum - Sistemi integrati - Teoria delle code in buffer UART

Avatar
Roby94 (Member)
Guru


Messaggi: 1170
Iscritto: 28/12/2009

Segnala al moderatore
Postato alle 18:21
Giovedì, 19/11/2015
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.

PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 20:18
Giovedì, 19/11/2015
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: https://piero.dev
PM Quote
Avatar
Roby94 (Member)
Guru


Messaggi: 1170
Iscritto: 28/12/2009

Segnala al moderatore
Postato alle 21:11
Venerdì, 20/11/2015
D'accordo con te Piero, ho modificato di conseguenza la libreria cosi
Codice sorgente - presumibilmente C#

  1. void UARTTxArray(const uint8_t array[], uint16_t n)
  2. {
  3.         do {           
  4.                 while(BufferFreeSpace(&UARTTxBuffer) < n && !BufferIsEmpty(&UARTTxBuffer));//Attendo che nel buffer vi sia spazio sufficiente per tutti i byte o che sia completamente vuoto
  5.                
  6.                 UARTTxInterruptDisabled();//Disabilito l'interrupt per la conclusione di invio di un byte
  7.                
  8.                 do {
  9.                         BufferPush(&UARTTxBuffer, *array);//Inserisco il byte corrente nel buffer di trasmissione
  10.                         n--;//Diminuisco di uno i byte da dover ancora inviare
  11.                         array++;//Sposto di un byte in avanti il puntatore al byte corrente
  12.                 } while(n != 0 && !BufferIsFull(&UARTTxBuffer));//Continuo fintanto che i byte ancora da inviare siano finiti o il buffer di trasmissione sia pieno
  13.                
  14.                 UARTTxInterruptEnabled();//Abilito l'interrupt per la conclusione di invio di un byte
  15.                
  16.                 UARTSendData();//Rinizio la procedura di invio dei dati
  17.         } while(n != 0);//Rieseguo il ciclo se rimangono ancora byte da inviare
  18. }


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 https://github.com/RobertoBochet/AVR-Libraries-C/blob/maste ...

PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 17:07
Sabato, 28/11/2015
Mi sembra a posto!


Il mio blog: https://piero.dev
PM Quote