logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Zbyt duża długość zadeklarowanej tablicy ?

_Robak_ 19 Lut 2010 16:57 1675 13
  • #1 7719241
    _Robak_
    Poziom 33  
    Witam,
    Dzisiaj natknąłem się na taki dziwny problem. Otóż, mam ja sobie atmege 1280 i zadeklarowaną tablicę do uarta UARTBuffer[] tak jak niżej
    
    #define BUFF_SIZE   8 
    volatile unsigned char UART0recv, UARTBuffer[BUFF_SIZE], UARTCount, UARTGet, rx_counter; 
    
    // Zmienne globalne, reszta 
    unsigned char a; 
    
    ISR(USART_RXC_vect) 
    { 
        
       UARTBuffer[UARTCount] = UDR; 
       UARTCount++; 
       rx_counter++; 
       if ( UARTCount == BUFF_SIZE ) 
       { 
          UARTCount = 0;       
       } 
           
    
    
    
    } 
    
    void uart_init(void) 
    { 
       UBRRL=25; 
       UCSRB=_BV(RXEN)|_BV(TXEN)|_BV(RXCIE); 
       UCSRC=_BV(URSEL)|_BV(UCSZ1)|_BV(UCSZ0); 
    } 
    
    void uart_putc(unsigned char ch) 
    { 
        
      loop_until_bit_is_set(UCSRA,UDRE); 
      UDR=ch; 
          
    } 
    
    unsigned char uart_getc (void) 
    { 
    
       if (UARTGet==BUFF_SIZE) 
       { 
          UARTGet = 0;       
       } 
    
       rx_counter--; 
       return (UARTBuffer[UARTGet++]); 
    
    }
    

    Cały program ma jakieś 3k linii kodu więc nie będę go tu umieszczać ;) Problem polega na tym, że jak stała BUFF_SIZE ma wartość 64 wszystko działa ok, jak dam już np 200 to program siada, dzieją się przeróżne rzeczy w zależności czy dam np. 200 czy 180. Aha, te dziwności dzieją się bez używania w ogóle uarta, więc w zasadzie te funkcje które wkleiłem nie są używane. Skutki zawsze takie same w zależności od długości, czyli przy 180 takie same efekty i przy 200 też zawsze takie same. Ram i flash zajęty w około 20%. Pytanie moje jest, co jest grane? ;) Wydaje mi się, że przy dłuższej tablicy nadpisują się jakieś zmienne ;/ Zawsze wydawało mi się, że długość tablicy może być dowolna byle by zmienna indeksująca była odpowiedniego typu, tutaj nawet ten problem nie wchodzi w gre bo te funkcje nawet się nie wywołują.
    Martwi mnie w ogóle występowanie tego problemu, niby przy 64 jest ok ale kto wie czy przy rozwijaniu programu się coś nie pojawi. No a największy problem jest taki że nie wiem jaki jest powód tego stanu rzeczy ;)

    inventco.eu - poprawiłem temat postu - regulamin p.11.1
  • Pomocny post
    #2 7719500
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Skoro te funkcje nie są używane, to błąd masz gdzieś indziej. Weź pod uwagę to, że rozmiar tej tablicy wpływa na lokalizację innych zmiennych i pewnie to generuje jakiś problem.

    4\/3!!
  • Pomocny post
    #3 7719530
    michalko12
    Specjalista - Mikrokontrolery
    Problem nie koniecznie musi być związany z tą tablicą. Jak deklarujesz większą tablicę to część zmiennych przesuwana jest na dalsze pozycje i to po nich coś może mazać, może coś ze stosem się dzieje. Może opisz dokładniej na czym polegają te przeróżne rzeczy.

    Kolejna sprawa to przy tej operacji powinieneś zablokować przerwanie od uarta.
      rx_counter--; 
  • #4 7719547
    _Robak_
    Poziom 33  
    Właśnie sobie uświadomiłem że przecież korzystam z drugiego uarta który jest tak samo zadeklarowany itd. Więc mały update ;) Z działania programu wnioskuje że może coś się chrzanić w tych funkcjach bo właśnie te cuda się pojawiają podczas wykorzystywania tych funkcji. Ale czemu? Przeciez 180 czy 200 nie wykracza poza unisgned chara :O
    Generalnie przy buforze 64 program działał co najmniej wiele setek godzin na kilku urządzeniach i wszystko śmigało bez problemu najmniejszego.
    Zmienne mogą się przesuwać, fakt, ale to przecież kompilator dba o to żeby wszystko było na swoim miejscu.
    Domyślam się że ciężko jest coś komuś powiedzieć bez wglądu w program. Ale może ktoś miał podobny problem, albo domyśla się co może być nie tak. Dokładnie te funkcje wykorzystywałem do zapisu bloków kart SD, bufor miał długość chyba 700 znaków i wszystko działało. Jestem daleki, od tego żeby mówić o błedach kompilatora;) Ale coś jest na rzeczy ;)
  • Pomocny post
    #5 7719647
    Konto nie istnieje
    Poziom 1  
  • #6 7719689
    _Robak_
    Poziom 33  
    atom1477, wydaje mi się że chyba nie ;) Aczkolwiek na pewno spróbuje je osobno deklarować, szczególnie że wszystkie zmienne są wykorzystywane w przerwaniu.
  • Pomocny post
    #7 7724745
    RSP
    Poziom 27  
    _Robak_ napisał:

    Przeciez 180 czy 200 nie wykracza poza unisgned chara :O
    Generalnie przy buforze 64 program działał co najmniej wiele setek godzin na kilku urządzeniach i wszystko śmigało bez problemu najmniejszego.


    Spróbuj użyć tablicy w rozmiarze 126 ( granica signed - unsigned ) , jeśli będzie OK. to znaczy że kompilator coś kręci . Czasami zdarzają się błędy w interpretacji zapisu zmiennych przez kompilator .

    Takie rzeczy się zdarzają , niestety , bywa że ktoś ten błąd znalazł i wymyślił sposób obejścia problemu .
  • Pomocny post
    #8 7726397
    OlekM
    Poziom 17  
    Zajętość pamięci RAM podawana przez WINAVR obejmuje tylko zmienne globalne. Wartość ta nie uwzględnia zatem pamięci wykorzystywanej w funkcjach - jej niski poziom nie zapewnia "sam w sobie" bezpieczeństwa.

    RAM zostanie (oczywiście) użyty do przechowania wszystkich zmiennych lokalnych wszystkich wywołanych w danej chwili funkcji. W niektórych przypadkach może to prowadzić do dużego wzrostu zapotrzebowania na pamięć.

    Proszę zatem upewnić się, czy w najgorszym możliwym przypadku ilość pamięci jaką muszą posiadać funkcje nie wykroczy poza pozostałe 80% wolnej pamięci RAM - zachowując drobny margines bezpieczeństwa.

    Oczywiście, jeśli reszta kodu nie alokuje dużych ilości pamięci - to problem zapewne leży w innym miejscu :-)
  • #10 7726967
    _Robak_
    Poziom 33  
    W funkcjach deklaruje co najwyżej kilka zmiennych ośmio lub szesnastobitowych. Ale jutro jak będę w pracy, to sobie zobaczę w symulatorze ten program, może coś się wyjaśni. Swoją drogą to chyba pierwszy raz przydałby mi się JTAG ;)
  • #11 7730599
    lukaszb-17
    Poziom 12  
    ja swojego czasu miałem podobne problemy z atmega128 gcc miałem wybrany powyższy procesor natomiast zaznaczony fuse bit atmega 103 compatibility
  • #12 7753952
    _Robak_
    Poziom 33  
    Problem leżał całkiem gdzie indziej i wcześniej po prostu przez przypadek działało (przy mniejszej tablicy) ;) Chyba ze 3h straciłem na analizę tego ale w końcu się udało ;d
  • #14 7756706
    _Robak_
    Poziom 33  
    Nie pisałem bo błąd był poniekąd niezwiązany z tematem, chodziło o wysyłanie po cctalku gdy podpiete urządzenia były wyłączone i wtedy siłą rzeczy nie działało echo, ja na odbierałem znaki getcharem których w buforze nie było. Co skutkowało tym że wskaźnik danych z 0 leciał w dół na 255 itd, potem zapisując dane pod bufor[255] nadpisywał zmienne bo długość tablicy była mniejsza. Dalej zastanawia mnie jak to działało wcześniej ;) Pewnie tak szczęśliwie się złożyło że po tablicy w pamięci nie było już zmiennych.
REKLAMA