2013-05-03 19 views
7

(Ze względu na ograniczoną ilość pamięci dostępną na większości płyt Arduino, czasami napotykam problemy przy użyciu poprawnego kodu C/C++, więc to pytanie dotyczy konkretnych problemów o użyciu struktur na Arduino.)Wyjaśnienie użycia struktur z Arduino i przechowywanie struktur w PROGMIE

Widziałem example code of using structs in Arduino, ale nie omawiałem żadnych wymagań dotyczących pamięci.

  1. Czy rozmiar struktury jest po prostu sumą typów danych jej pól?
  2. Czy przechowywanie znaczników w PROGMEM jest opcją? Czy są problemy z szybkością dostępu?
  3. Są to pola z możliwością zapisu w formacie struct (np. Przykład poniżej s1.LED1.state = 0;) (ale nie w przypadku, gdy jest on zapisany w PROGMEM, oczywiście).
  4. Czy mogę zdefiniować pole struktury jako inną (inny typ) strukturę?
  5. Czy można iterować za pomocą struktury przy użyciu for..in lub według indeksu?

Moim zastosowaniem jest to, że mam 64 diody LED napędzane przez układ MAX7219. Ze względu na wymagania dotyczące fizycznego układu okablowania, wygodne byłoby zorganizowanie kolejności diod LED w bardziej logiczny sposób za pomocą struktur, aby uczynić programowanie łatwiejszym/bardziej spójnym.


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

Ciekawe, że nigdy nie widział „szerokość” zapis na elemencie :) Gdyby 'byte' nie być' LED' w 'LED_SECTION' struct? – leppie

+0

Również "bajt" ze 128 bitami? Czym jest to szaleństwo? – leppie

+0

@leppie - tak. skopiuj/wklej błąd. dzięki za wskazanie –

Odpowiedz

1
  1. Przy użyciu składni średników, wielkość struktury zostanie suma a Jego pola.
  2. Myślę, że jego możliwe przy użyciu następującej składni: (http://www.arduino.cc/en/Reference/PROGMEM)

    LED leds PROGMEM; 
    
  3. Tak są, składnia jest jak napisałeś w swoim pytaniu.

  4. Tak możesz:

    typedef struct { struct otherStruct; };

  5. Tak, możesz to zrobić używając masek.Na przykład:

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

Odnośnie ostatniego komentarz do tej odpowiedzi, pozwól mi zaproponować następujące rozwiązanie:

zorganizować diody w taki sposób, że ich rozwiązanie nie będzie trwać pamięć (jak w pytaniu - struktura LED pobiera pamięć do adresowania). Zamiast tego można zająć się diody wykorzystując swoją pozycję w tablicy w struct jak poniżej:

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 

Można rozważyć umieszczenie tablicy w inny sposób, z 256 pozycji w struktury i 8 elementów w tablicy, tak rzędami będą odnoszone do przez [] i cols po kropce, tak:

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

dzięki! Szczegóły: czy '& 1' w' (s1 << i) i 1' odnosi się do adresu pamięci instancji struct 's1'? Co to jest ta operacja, więc mogę ją przeczytać. Rozumiem część bitshifting, po prostu nie "& 1" –

+0

w celu zapewnienia najlepszej odpowiedzi na twoje pytanie, czy mógłbyś mi powiedzieć, czego potrzebujesz definicji wiersza i col w strukturze led? – SatA

+0

W moim projekcie diody LED są sterowane za pomocą układu multipleksera 8x8 (MAXIM7219). Aby adresować poszczególne diody LED, muszę znać ich wiersz (np. Rejestr 1-8). 7219 używa wartości bitowych dla adresów kolumn (1-256). Muszę więc zapisać co najmniej dwie wartości: register i bitmask. Ponieważ będę używał PROGMEM do tego, jeśli będę musiał zachować stan, użyłbym jakiejś tablicy dynamicznej. –