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

ATMEGA128 - BASCOM - jak zarządzać limitem zmiennych lokalnych w dużym programie?

sundayman 30 Kwi 2013 19:50 1911 4
REKLAMA
  • #1 12256654
    sundayman
    Poziom 26  
    Mam dość spory program (ok. 9000 linii, zajmuje mi teraz 94% pamięci).
    Wszystko działa, ale czasem natrafiam na problem z ilością zmiennych lokalnych - np. w pewnej procedurze mam teraz 26 zmiennych lokalnych (o ile dobrze policzyłem :) ;

    
       Local A_var1 As Word , A_var2 As Word , A_var_dword As Dword
       Local A_adc0 As Word , A_adc0_disp As Byte
       Local Select_amp As Byte , Ax_sm As Byte , Ay_sm As Byte , Bx_sm As Byte , By_sm As Byte
    
       Local A_pot_val_disp As Byte , A_pot_value As Byte , A_eram_pot_value As Byte
       Local A_noise As Byte , A_noise_disp As Byte , A_noise_level As Word , A_eram_noise_level As Word
       Local A_trig As Byte , A_trig_disp As Byte , A_trigger As Word , A_eram_trigger As Word,
       Local Signal_counter As Byte
    
       ' zmienne dla pomiarów automatycznych
       Local A_for As Byte , A_err As Byte
       Local Audio_accu As Dword , Audio_max As Word
    



    i kiedy chcę dodać kolejną, podczas kompilacji jest błąd (zupełnie bez sensu, wskazujący na brak deklaracji jakiejś zupełnie innej procedury).

    Mam zadeklarowane spore stosy :

    
    $hwstack = 384                                              ' default use 32 for the hardware stack
    $swstack = 384                                              ' default use 10 for the SW stack
    $framesize = 384
    


    Program działa poprawnie nawet dla wartości 256 ( o ile się dało podglądałem zawartość sram w symulatorze), nawet jak zwiększam do 512 też nie pozwala to na dodanie kolejnej zmiennej lokalnej.

    O co może chodzić ? Czyżby jakiś limit ? Niby można to obejść zmiennymi globalnymi, ale niezbyt to wygodne i porządne.
  • REKLAMA
  • #2 12258889
    Mundi1970
    Poziom 24  
    Jeżeli jest to procedura (SUB) do której nie przekazujesz żadnych argumentów to maksymalna ilość zmiennych lokalnych to 32, większa ilość wywala błąd. Zrobiłem mały test, napisałem procedurę z 32 zmiennymi lokalnymi do której przekazuje 2 argumenty. Podczas kompilacji nie ma żadnego błędu ale procedura nie działa prawidłowo. Gdy zmniejszyłem ilość zmiennych o 2 (32-2 argumenty = maksymalnie 30 zmiennych), wszystko zaczęło prawidłowo działać.
  • REKLAMA
  • #3 12259411
    sundayman
    Poziom 26  
    To jest SUB bez parametrów. No cóż, zastosowałem zmienne globalne... Ale ciekawe, z czego wynika to ograniczenie, nigdzie nie udało mi się znaleźć żadnej informacji na ten temat. Podobno lokalne są trzymane w $frame, no więc powinno się dać dużo więcej zmiennych lokalnych zrobić, a tu taki zonk...
  • REKLAMA
  • #4 12259953
    Mundi1970
    Poziom 24  
    Cytat:
    Podobno lokalne są trzymane w $frame, no więc powinno się dać dużo więcej zmiennych lokalnych zrobić, a tu taki zonk...

    Tak, ale też wykorzystany jest softwarowy stos w którym są wskaźniki do tych zmiennych (adresy zmiennych). W Bascom'ie rejestr Y jest wykorzystany jako baza stosu softwarowego. Ograniczenie wynika stąd że do pobierania adresów zmiennych wykorzystany jest adresowania pośrednie z przemieszczeniem, gdzie przesunięcie od bazy może mieć wartość od 0 do 63.

    000000BE:   E081        LDI       R24,0x01       Load immediate
    +000000BF:   ADAA        LDD       R26,Y+58       Load indirect with displacement
    26:       A1 = 1
    +000000C0:   ADBB        LDD       R27,Y+59       Load indirect with displacement
    +000000C1:   938C        ST        X,R24          Store indirect
    27:       A2 = 2
    +000000C2:   E082        LDI       R24,0x02       Load immediate
    +000000C3:   ADA8        LDD       R26,Y+56       Load indirect with displacement
    27:       A2 = 2
    +000000C4:   ADB9        LDD       R27,Y+57       Load indirect with displacement
    +000000C5:   938C        ST        X,R24          Store indirect
    28:       A30 = 3
    +000000C6:   E083        LDI       R24,0x03       Load immediate
    +000000C7:   81A8        LDD       R26,Y+0        Load indirect with displacement
    28:       A30 = 3
    +000000C8:   81B9        LDD       R27,Y+1        Load indirect with displacement
    +000000C9:   938C        ST        X,R24          Store indirect
    34:       Test = A30
    +000000CA:   81A8        LDD       R26,Y+0        Load indirect with displacement
    +000000CB:   81B9        LDD       R27,Y+1        Load indirect with displacement
    34:       Test = A30
    +000000CC:   918C        LD        R24,X          Load indirect
    +000000CD:   ADAE        LDD       R26,Y+62       Load indirect with displacement
    34:       Test = A30
    +000000CE:   ADBF        LDD       R27,Y+63       Load indirect with displacement
    +000000CF:   938C        ST        X,R24          Store indirect
    
  • #5 12262905
    sundayman
    Poziom 26  
    To wyjaśnia sprawę :)

    No trudno, przynajmniej wiem, że to jest jakoś uzasadnione, a nie jest to jakaś przypadkowe "magiczne" zjawisko. Dzięki za wyjaśnienie !
REKLAMA