Elektroda.pl
Elektroda.pl
X
Arrow Multisolution Day
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[C][ATmega8] - Odchudzenie kodu - oświetlenie samochodowe

milowerk 19 Mar 2013 15:21 1041 9
  • #1 19 Mar 2013 15:21
    milowerk
    Poziom 10  

    Witam,
    próbuję zrobić swój pierwszy projekt, polegający na symulacji, przy pomocy mikrokontrolera ATmega8, świateł w samochodzie. W skrócie co odpowiedni okres czasu mają się włączać kierunkowskazy, światła STOPu itp. Problemem jest jednak "wielkość" programu, podczas kompilacji w Eclipse wyskakuje mi komunikat, że program jest za duży o 1308 bajtów. Czy możecie mi doradzić w jaki sposób można poniższy kod "odchudzić", tak aby się zmieścił na ww. mikrokontrolerze?

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Z góry dziękuję za pomoc.
    Pozdrawiam.

    0 9
  • Arrow Multisolution Day
  • Pomocny post
    #2 19 Mar 2013 15:30
    mickpr
    Poziom 39  

    Primo: Jak to za duży? Ten program będzie zajmował ...

    Code:
    Invoking: Print Size
    
    avr-size --format=avr --mcu=atmega8 Test2.elf
    AVR Memory Usage
    ----------------
    Device: atmega8

    Program:      78 bytes (1.0% Full)
    (.text + .data + .bootloader)

    Data:          0 bytes (0.0% Full)
    (.data + .bss + .noinit)


    Coś źle ustawiłeś.
    Secundo: nie używaj takich dużych parametrów dla _delay_ms.
    https://www.elektroda.pl/rtvforum/topic843037.html

    0
  • Arrow Multisolution Day
  • Pomocny post
    #3 19 Mar 2013 16:00
    tmf
    Moderator Mikrokontrolery Projektowanie

    Dlaczego nie? Wątek, który podałeś jako przykład to stek bzdur. Przy pomocy delay_ms można realizować opóźnienia bardzo długie, z pewnością przekraczające 3000ms:
    http://mikrokontrolery.blogspot.com/2011/04/gcc-avr-funkcje-opoznienia-delay.html

    0
  • #5 19 Mar 2013 19:09
    milowerk
    Poziom 10  

    Faktycznie, okazało się, że miałem opcje Build miałem ustawioną na Debug, a nie Release. Dzięki za pomoc.
    Jednak program po kompilacji znacznie różni się pod względem wielkości z tym, co napisał mickpr. Mój log z konsoli wygląda następująco:

    Cytat:

    Invoking: Print Size
    avr-size --format=avr --mcu=atmega8 BGM.elf
    AVR Memory Usage
    ----------------
    Device: atmega8

    Program: 600 bytes (7.3% Full)
    (.text + .data + .bootloader)

    Data: 0 bytes (0.0% Full)
    (.data + .bss + .noinit)


    Mój program zajmuje ponad 7 razy więcej miejsca. Jakie ustawienia jeszcze mogę zmienić, żeby to poprawić?

    Pozdrawiam.

    0
  • #6 19 Mar 2013 19:14
    excray
    Poziom 39  

    Jak chcesz skrócić zastąp wszystkie _delay_ms() funkcją _delay_ms_var() z linku podanego przez tmf.

    0
  • #7 19 Mar 2013 19:30
    milowerk
    Poziom 10  

    excray napisał:
    Jak chcesz skrócić zastąp wszystkie _delay_ms() funkcją _delay_ms_var() z linku podanego przez tmf.


    Bardziej chodziło mi o różnice w wielkości wsadu dla tego samego mikrokontrolera. Zajęcie 7% w moim przypadku w niczym mi nie przeszkadza. Pytanie było z czystej ciekawości.

    Pozdrawiam.

    0
  • #8 19 Mar 2013 19:57
    excray
    Poziom 39  

    Pewnie inna optymalizacja. Zmień to co Ci napisałem.

    0
  • #9 19 Mar 2013 21:13
    mickpr
    Poziom 39  

    milowerk napisał:
    Bardziej chodziło mi o różnice w wielkości wsadu dla tego samego mikrokontrolera.
    No i wyłapałeś mój drugi błąd - wyłączoną optymalizację.
    Po włączeniu optymalizacji rozmiaru "Os" wynik jest taki sam jak w twoim przypadku.
    :)

    0
  • #10 19 Mar 2013 21:52
    milowerk
    Poziom 10  

    OK, wielkie dzięki za zainteresowanie i pomoc.

    Pozdrawiam,
    Paweł

    0