Elektroda.pl
Elektroda.pl
X
Serwerowe OpowieściSerwerowe Opowieści
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Attiny2313A - odczyt danych z tablicy w pamięci

17 Mar 2015 09:34 864 11
  • Poziom 9  
    Piszę program do czujnika zliczającego stan licznika gazu i wysyłającego dane na serwer w losowych odstępach czasu. Problemem jest fragment kodu:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Generalnie pomysł jest taki, że co sekundę timer zwiększa wartość zmiennej tick_1s i gdy jest ona równa wartości wyslij_teraz uruchamiana jest procedura wysyłki danych na serwer. Wartość ta wynosi 9minut plus kolejna (pseudolosowa) wartość z tablicy. Gdy odwołuję się do tablicy wpisując bezpośrednio numer elementu, tak jak teraz wszystko jest ok. Jak tylko zamiast liczby dam tak zmienną (linijka z komentarzem) program zachowuje się dziwnie.
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Każda procedura wysyłająca wywoływana jest 3 razy. Za pierwszym razem przesyłane są poprawne dane, a za dwoma kolejnymi śmieci (pogrubione linijki). Transmisja na pewno jest ok, bo sumy CRC16 się zgadzają. Wygląda na to, że złe dane są przekazywane jako argumenty funkcji. Tylko, że one nie zależą od zmiennej seq, której użycie powoduje problem.

    I jeszcze jedna ciekawostka, jeśli odwołam się do tablicy przez podanie liczby i dodam w procedurze wysyłającej odczytam dane z tablicy przy użyciu zmiennej np.
    Kod: c
    Zaloguj się, aby zobaczyć kod

    to problem znów występuje -objawy są takie same.

    Nie mam debugera więc mam trochę utrudnione zadanie. Pewnie to jakiś szkolny błąd. Czy może ktoś zerknąć i zobaczyć, gdzie jest błąd? Cały kod w załączniku. Serdecznie dziękuję za sugestie
  • Serwerowe OpowieściSerwerowe Opowieści
  • Pomocny post
    Użytkownik usunął konto  
  • Serwerowe OpowieściSerwerowe Opowieści
  • Poziom 9  
    128B SRAM.

    Eclipse wypluwa coś takiego:

    Odczyt z tablicy przy użyciu zmiennej:

    AVR Memory Usage
    ----------------
    Device: attiny2313a

    Program: 1918 bytes (93.7% Full)
    (.text + .data + .bootloader)

    Data: 124 bytes (96.9% Full)
    (.data + .bss + .noinit)

    Odczyt przy użyciu liczby:

    AVR Memory Usage
    ----------------
    Device: attiny2313a

    Program: 1804 bytes (88.1% Full)
    (.text + .data + .bootloader)

    Data: 24 bytes (18.8% Full)
    (.data + .bss + .noinit)

    Mniejsze zużycie jest logiczne, bo kompilator nie ładuje całej tablicy. No moja tablica zajmuje prawie cały RAM...
  • Pomocny post
    Poziom 34  
    W raporcie wykorzystania RAM kompilator nie uwzględnia zajęcia pamięci przez stos (bo jest dymaiczny), a ten jednak gdzieś się musi zmieścić.
  • Poziom 9  
    Tak będzie ok?
    Kod: c
    Zaloguj się, aby zobaczyć kod
  • Poziom 9  
    To może poproszę też niekonserwatywną :)
  • Pomocny post
    Poziom 27  
    Do usług:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Dostęp jak do "zwykłej" zmiennej w RAM'ie (nie potrzeba makr pgm_read_...).

    Nie wiem w jakim środowisku działasz: w Eclipsie analizator kodu nie jest zachwycony tym __flash - Syntax Error - przy czym w żadnym stopniu nie przeszkadza to w kompilacji ;) Profilaktycznie podaję jak pozbyć się błędu, żeby nie raził w oczy: prawy klik na projekt (w Project Explorer) -> Properties -> C/C++ General -> Preprocessor Include Paths, Macros, etc. -> zakładka Entries -> klik na "CDT User Setting Entries" -> przycisk "Add" -> z listy rozwijanej "Preprocessor Macro", name: "__flash", ptaszek przy "Treat as built-in".

    O innych środowiskach się nie wypowiadam bo nie znam ;)
  • Poziom 9  
    Dziękuję za wszelką pomoc - działa :) Tylko nie udało mi się wyłączyć raportowania błędów w Eclipse. Co powinienem wpisać w value?
  • Pomocny post
    Poziom 27  
    Ja nie mam nic w polu value i działa (tzn nie pojawia się Syntax). Zerknij do: C/C++ General -> Indexer -> na dole okna jest lista rozwijana (Build configuration for the indexer) - zobacz czy jest wybrane Release; i upewnij się czy na pewno masz aktywną konfigurację Release a nie Debug (lista rozwijana przy ikonce "młotka" w głównym oknie Eclipse'a).

    Jak nie pomoże to ja się poddaję ;)
  • Poziom 9  
    wszystko działa - dzięki :)