Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Embedded Data Structures - Francesco Sacchi

Embedded Data Structures - Francesco Sacchi

Avatar for Better Embedded

Better Embedded

September 24, 2012
Tweet

More Decks by Better Embedded

Other Decks in Technology

Transcript

  1. Francesco Sacchi – [email protected] Embedded data structures Sviluppatori firmware di

    basso livello, su architetture a microcontrollore senza MMU (AVR, PIC, ARM7, Cortex-M3/M4, etc...). Linguaggio di programmazione C. Obbiettivi Target audience Presentare alcune strutture dati di utilizzo generico e la loro implementazione ottimizzata per applicazioni embedded, analizzando pregi, casi d'uso e difetti.
  2. Francesco Sacchi – [email protected] Presentazione • Maintainer di BeRTOS •

    Sistema operativo open source per applicazioni embeddded real-time sviluppato da Develer • Oltre al kernel sono disponibili driver e librerie generiche
  3. Francesco Sacchi – [email protected] Embedded data structures: premessa • Spesso

    non si hanno a disposizione implementazioni di strutture dati specifiche per ambiti embedded. • Le implementazioni generiche per Desktop non sono spesso adatte perché usano memoria dinamica o sono scritte in linguaggi diversi. • Si ripiega quindi su qualcosa di già disponibile, a scapito dell'efficienza
  4. Francesco Sacchi – [email protected] Array E' una collezione di elementi,

    ognuno accessibile tramite un indice. 'A' 'B' 'C' 'D' 'E' 'F' 0 Value Index 1 2 3 4 5
  5. Francesco Sacchi – [email protected] Array: proprietà • E' possibile accedere

    ad un qualsiasi elemento dell'array con un tempo costante. • Per inserire e rimuovere elementi è necessario riorganizzare e/o riallocare l'array, con un tempo che dipende dalla dimensione dell'array stesso. 'A' 'B' 'C' 'D' 'E' 'F' 0 Value Index 1 2 3 4 5
  6. Francesco Sacchi – [email protected] Linked list • E' un insieme

    di nodi organizzati in modo da rappresentare una sequenza. • Ogni nodo è collegato al successivo tramite un riferimento Node1 Node2 Node3
  7. Francesco Sacchi – [email protected] Linked list: proprietà • Gli elementi

    possono essere inseriti e rimossi da ogni posizione, senza bisogno di riorganizzare l'intera struttura. • Non è possibile accedere ad un particolare elemento della lista senza scorrerla Node1 Node2 Node3
  8. Francesco Sacchi – [email protected] Linked list: casi d'uso concreti •

    Player audio: brani da riprodurre • Macchina CNC: comandi per gli assi da eseguire in sequenza • Kernel: lista processi da schedulare, in attesa su eventi, etc...
  9. Francesco Sacchi – [email protected] Linked list: double linked list •

    E' un implementazione più comune di lista perché permette di effettuare modifiche in modo più semplice e veloce. • Non è necessario avere un riferimento al nodo precedente quando si opera su un nodo. • Ogni nodo occupa più memoria perché ha 2 riferimenti. Node1 Node2 Node3 Head Tail
  10. Francesco Sacchi – [email protected] Linked list: storage interno • I

    nodi contengono al loro interno il payload di dati (o viceversa) • Lo stesso dato non può essere inserito contemporaneamente in più liste. • Indicato per payload piccoli (pochi byte) e quando non è necessario inserire lo stesso nodo in più liste. Node1 Node2 Node3 Head Tail Data1 Data2 Data3
  11. Francesco Sacchi – [email protected] Linked list: implementazione • Implementazione molto

    veloce • Bassissimo impatto sull'occupazione in flash Vantaggi Svantaggi • Ogni nodo richiede 2 puntatori, se il payload è piccolo l'overhead è notevole • Lista non protetta da accesso concorrente (ma si può risolvere facilmente)
  12. Francesco Sacchi – [email protected] Linked list vs Array Array List

    Accesso casuale agli elementi O(1) O(n) Inserimento, rimozione e spostamento elementi O(n) O(1) Complessità computazionale
  13. Francesco Sacchi – [email protected] FIFO • E' una coda in

    cui i dati vengono prelevati nello stesso ordine in cui sono inseriti.
  14. Francesco Sacchi – [email protected] FIFO: casi d'uso concreti • Router

    di rete: ricezione e re-invio dei pacchetti a seconda della destinazione. • Eco digitale: i campioni audio sono inseriti in una FIFO e riletti dopo un ritardo per simulare un effetto eco. • Buffer circolare: da dentro una ISR di una periferica seriale vengono inseriti i byte ricevuti che poi verranno prelevati dal livello applicativo.
  15. Francesco Sacchi – [email protected] FIFO: implementazione Buffer circolare 'A' 'B'

    'C' 'D' 'E' head begin tail end • Begin: inizio del buffer • Head: puntatore alla prima locazione occupata in lettura (out) • Tail: puntatore alla prima locazione libera in scrittura (in) • End: fine del buffer
  16. Francesco Sacchi – [email protected] FIFO: implementazione FIFO piena 'D' 'A'

    'B' 'C' head tail • Head punta all'inizio e tail alla fine. • Tail punta alla locazione immediatamente precedente a head. 'B' 'C' 'D' 'A' head tail
  17. Francesco Sacchi – [email protected] FIFO: implementazione • Implementazione molto veloce.

    • Bassissimo impatto sull'occupazione in flash. • Usata in un algoritmo lock-free è utilizzabile con accesso concorrente, senza necessità di sincronizzazione. Vantaggi Svantaggi • E' necessario sempre avere una locazione vuota (si spreca quindi una posizione nel buffer). • E' sempre necessario controllare se la FIFO è piena prima di effettuare una push(). • E' sempre necessario controllare se la FIFO è vuota prima di effettuare una pop().
  18. Francesco Sacchi – [email protected] FIFO: algoritmo produttore/consumatore 'A' 'B' tail

    'C' head ISR • fifo_isFull() • fifo_push() Application • fifo_isEmpty() • fifo_pop() Se la CPU è in grado di aggiornare un puntatore atomicamente non è necessaria nessuna protezione!