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

[Rozwiązano] Jak zredukować zużycie pamięci RAM i programu przez ADC na Attiny?

czerstwy22 10 Maj 2012 13:09 1956 15
  • #1 10881010
    czerstwy22
    Poziom 9  
    Otóż podczas pisania pierwszego programu, z pomocą książki pana Kardasia niejednokrotnie polecanej, udało się go skompilować etc. Tylko że obsługa ADC pożera mi 4kB programu i 264 bity RAMu. Attiny tylko te największe mają takie zasoby (bo to na nich ma być program, tych 8-nóżkowych). reszta programu nie rusza RAMu a sam zajmuje niecałe 200 bitów... Oto i niesforny fragment kodu:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Mogę liczyć na waszą pomoc? Spędza mi to sen z powiek, tym bardziej że dopiero wgryzam się w temat. Może jakieś ustawienia kompilacji? No nie mam naprawdę wizji jak to zmniejszyć.
  • #2 10881040
    dondu
    Moderator na urlopie...
    czerstwy22 napisał:
    Otóż podczas pisania pierwszego programu, z pomocą książki pana Kardasia niejednokrotnie polecanej, udało się go skompilować etc. Tylko że obsługa ADC pożera mi 4kB programu i 264 bity RAMu.
    ...
    Może jakieś ustawienia kompilacji? No nie mam naprawdę wizji jak to zmniejszyć.

    Prawdopodobnie nie masz włączonej optymalizacji kodu. Ustaw: -0s
  • #3 10881054
    silvvester
    Poziom 25  
    500 bajtów to obsługa LCD, proste menu, przetwornik AD i trochę innych, właśnie z tej książki.
    Bez zamieszczenia całego kodu nie dostaniesz wskazówek.
  • #4 10881118
    czerstwy22
    Poziom 9  
    Gdzie to ustawie w Eclipse? Jak mówiłem, dla mnie to wszystko jest nowe. Reszta programu to są deklaracje i sterowanie stanami na pinach, po lekturze książki dla mnie jest to na tyle oczywiste co tam się dzieje, że w sumienie wiem w czym miałby pomóc. Ale w takim razie to jest całość:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    EDIT:
    dorwałem się do ustawień optymalizacji, ale na każdym trybie nie schodzi poniżej 4kB
  • #5 10881149
    dondu
    Moderator na urlopie...
    Pokaż komunikaty kompilacji.

    Takie zastosowanie delay jest problemogenne:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Zrób funkcję z pętlą for zależną od parametru czas i wywołującą stałe opóźnienie np. _delay_ms(1).
  • #6 10881157
    czerstwy22
    Poziom 9  
    sugerujesz co zrobić z delay? Bo właśnie muszę operować na tym czasie

    Zakładka "Console"?:
    
    **** Build of configuration Release for project krokowy ****
    
    make all 
    Building file: ../main.c
    Invoking: AVR Compiler
    avr-gcc -Wall -Os -fpack-struct -fshort-enums -std=gnu99 -funsigned-char -funsigned-bitfields -mmcu=attiny45 -DF_CPU=1000000UL -MMD -MP -MF"main.d" -MT"main.d" -c -o"main.o" "../main.c"
    Finished building: ../main.c
     
    Building target: krokowy.elf
    Invoking: AVR C Linker
    avr-gcc -Wl,-Map,krokowy.map -mmcu=attiny45 -o"krokowy.elf"  ./main.o   
    Finished building target: krokowy.elf
     
    Invoking: AVR Create Extended Listing
    avr-objdump -h -S krokowy.elf  >"krokowy.lss"
    Finished building: krokowy.lss
     
    Create Flash image (ihex format)
    avr-objcopy -R .eeprom -O ihex krokowy.elf  "krokowy.hex"
    Finished building: krokowy.hex
     
    Create eeprom image (ihex format)
    avr-objcopy -j .eeprom --no-change-warnings --change-section-lma .eeprom=0 -O ihex krokowy.elf  "krokowy.eep"
    Finished building: krokowy.eep
     
    Invoking: Print Size
    avr-size --format=avr --mcu=attiny45 krokowy.elf
    AVR Memory Usage
    ----------------
    Device: attiny45
    
    Program:    4032 bytes (98.4% Full)
    (.text + .data + .bootloader)
    
    Data:        264 bytes (103.1% Full)
    (.data + .bss + .noinit)
    
    
    Finished building: sizedummy
     
    
  • #8 10881186
    czerstwy22
    Poziom 9  
    dondu, jesteś wielki, teraz nie używa ramu i spokojnie wejdzie w Attiny13 (238bitów).
    Za diabła bym na to nie wpadł. Dzięki
    teraz definicja wygląda tak
    #define czekaj for(i=0;i<czas;i++) _delay_ms(1);
    i przed główną pętlą zadeklarowałem i.
    Jeszcze raz dzięki za wskazówkę. (kliknąłem pomógł :wink: )
  • #9 10882165
    Fredy
    Poziom 27  
    Jeszcze kilka bajtów odzyskasz jeśli sobie zrobisz funkcję opóżniającą do której będziesz wysyłał czas opożnienia. W przypadku uzycia wielokrotnego czekaj , używając defina w każde miejsce kompilator wklei ci ten kod z pętlą. A tak miałbyś ten kod tylko 1 raz.

    COś w ten deseń:

    Czekaj(char zwloka)
    {
    while(zwloka--) _delay_ms(1);
    }
  • #11 10883525
    tehaceole

    Poziom 28  
    czerstwy22 napisał:
    spokojnie wejdzie w Attiny13 (238bitów)
    czerstwy22 napisał:
    sam zajmuje niecałe 200 bitów

    Może się czepiam, ale różnica pomiędzy bitami a bajtami jest dość znaczna. Kolego operuj poprawnym nazewnictwem. Ty napewno orientujesz się w tym co chcesz przedstawić, ale ktoś inny może zostać zdezorientowany Twoim nieprawidłowym nazewnictwem. :)
    Niestety, ale funkcje opóźniające (jak pisał Kol. dondu) trzeba "opakować":
    Kod: text
    Zaloguj się, aby zobaczyć kod

    Mirek w swojej książce chyba poruszał to zagadnienie ( z tego co pamiętam). Nazwy funkcji celowo mam zmienione względem funkcji oryginalnych, aby uniknąć ew. pomyłki z wpisaniem np _delay_ms(1); zamiast _delay_ms1(1);
  • #12 10890807
    czerstwy22
    Poziom 9  
    Czyli żeby ów funkcje wcześniej zdefiniować i wtedy już z tego korzystać? Na pewno skorzystam, dzięki.
    Wiem jaka jest różnica, tylko widocznie z angielskiego mi się pochrzaniły bity z bajtami. Sory. No jak by pomyśleć to na bity to trochę mało, nawet jak na taki kod... Na razie chce wgrać program w docelowy układ, zobaczyć czy i jak działa.
  • #13 10891596
    gaskoin
    Poziom 38  
    tehaceole napisał:

    Kod: text
    Zaloguj się, aby zobaczyć kod


    Trzeba pamiętać, że dla dużych opóźnień opóźnienia mikrosekundowe mogą stać się opóźnieniami milisekundowymi :) (pętla for też trochę czasu zajmuje) Wtedy trzeba rozwiązać to inaczej.
  • #14 10894218
    tehaceole

    Poziom 28  
    gaskoin - generalnie NAJLEPIEJ zmienić całkowicie sposób myślenia i podejście do programowania i... unikać wszelkiej maści opóźnień w programie :) Oczywiście poza tymi, które są niezbędne przy obsłudze niektórych urządzeń.
  • #15 10902281
    czerstwy22
    Poziom 9  
    ja jestem tego świadomy, ale sterowanie silnikiem potrzebuje trochę czasu, co by mógł się przekręcić xD
  • #16 10902408
    tmf
    VIP Zasłużony dla elektroda
    Ale do odmierzania tego czasu nie potrzebujesz delay. Zrób to w przerwaniach, dzięki temu łatwo też uzyskać regulację prędkości.
REKLAMA