2013-05-03 16 views
7

(A causa della memoria limitata disponibile sulla maggior parte delle schede Arduino, a volte ho riscontrato problemi utilizzando codice C/C++ valido, quindi questa domanda riguarda specificamente eventuali problemi sull'uso struct su Arduino.)Chiarificazione dell'uso delle strutture con Arduino e memorizzazione delle strutture in PROGMEM

ho visto example code of using structs in Arduino ma nessuna discussione di reqs memoria.

  1. è la dimensione di una struttura semplicemente la somma dei tipi di dati dei suoi campi?
  2. È possibile memorizzare le strutture in PROGMEM? Ci sono problemi di velocità di accesso?
  3. I campi di una struct scrivibile (ad esempio sotto s1.LED1.state = 0;) (sebbene non siano memorizzati in PROGMEM, ovviamente).
  4. Posso definire un campo di una struttura come un'altra struttura (di tipo diverso)?
  5. E 'possibile scorrere una struct usando for..in o per indice?

Il mio caso di utilizzo è che ho 64 LED pilotati da un chip MAX7219. A causa dei requisiti del layout del cablaggio fisico, sarebbe opportuno organizzare l'ordine dei LED in modo più logico utilizzando le strutture per rendere la programmazione più semplice/più coerente.


typedef struct { 
     byte row : 6; 
     byte col : 128; 
     byte state : 1; 
    } LED; 

typedef struct { 
     LED LED1 : {1,1,1}; 
     LED LED2 : {1,2,1}; 
     LED LED3 : {1,4,1}; 
     LED LED4 : {1,8,1}; 
     LED LED5 : {1,16,1}; 
     LED LED6 : {1,32,1}; 
     LED LED7 : {1,64,1}; 
     LED LED8 : {1,128,1}; 
    } LED_SECTION; 

LED_SECTION s1; 
s1.LED1.row = 1; 

s1.LED1.state = 0; 
+0

Interessante, mai visto che la notazione 'width' per le strutture :) caso 'byte' non essere' LED' nel 'LED_SECTION' struct? – leppie

+0

Inoltre, un 'byte' con 128 bit? Cos'è questa follia? – leppie

+0

@leppie - sì. copia/incolla errore grazie per indicarlo –

risposta

1
  1. Quando si utilizza la sintassi virgola, la dimensione della struttura sarà la somma di a tutti i suoi campi
  2. penso che la sua possibile utilizzando questa sintassi: (http://www.arduino.cc/en/Reference/PROGMEM)

    LED leds PROGMEM; 
    
  3. Sì lo sono, la sintassi è la hai scritto nella tua domanda.

  4. Sì è possibile:

    typedef struct { struct otherStruct; };

  5. Sì, è possibile farlo utilizzando le maschere.Per esempio:

    for (int i = 0, byte cur = s1 & 1; ; i < numOfFieldsInStruct; i++, cur = (s1<<i)&1) { 
        .... 
    } 
    

Per quanto riguarda il tuo ultimo commento a questa risposta, mi permetta di proporre la seguente soluzione:

Organizzare i led in un modo che li affrontare non ci vorrà memoria (come nella domanda: la struttura LED prende memoria per l'indirizzamento). Invece, è possibile affrontare i led usando la loro posizione in un array e nella struct come questo:

typedef struct { 
    byte LED1 : 1; 
    byte LED2 : 1; 
    byte LED3 : 1; 
    byte LED4 : 1; 
    byte LED5 : 1; 
    byte LED6 : 1; 
    byte LED7 : 1; 
    byte LED8 : 1; 
} LED_ROW; 

LED_ROW leds[256]; 

leds[0].LED1 = 1; // turn led at row 0, col 0 to 1 
leds[0].LED5 = 1; // turn led at row 4, col 0 to 1 
led[100].LED3 = 1; // turn led at row 2, col 100 to 1 
... 
// and so on 

Si può prendere in considerazione l'organizzazione della matrice in modo diverso, con 256 elementi nella struct e 8 voci nella matrice così le righe sarà riferito a da [] ed i colli dopo il punto, in questo modo:

leds[0].LED3 = 1; // turn on led at row 0, col 2 to 1 
+0

grazie! Un dettaglio: è il '& 1' in' (s1 << i) & 1' che fa riferimento all'indirizzo di memoria dell'istanza struct 's1'? Come si chiama questo tipo di operazione, così posso leggerlo. Capisco la parte bitshifting, non solo il '& 1' –

+0

al fine di fornire la migliore risposta per la tua domanda, potresti dirmi di cosa hai bisogno per la definizione di riga e colonna nella struttura led? – SatA

+0

Nel mio progetto, i LED sono controllati da un chip multiplexor 8x8 (MAXIM7219). Per indirizzare i singoli LED, ho bisogno di conoscere la loro riga (ad es. Registro 1-8). Il 7219 utilizza i valori di bit per gli indirizzi di colonna (1-256). Quindi ho bisogno di memorizzare almeno due valori: registro e maschera di bit. Dal momento che userò PROGMEM per questo, se ho bisogno di memorizzare lo stato, userei una sorta di array dinamico. –

Problemi correlati