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

Optymalizacja kodu aby wynikowo zajmował mniej RAM w uC

mariomario 04 Cze 2020 11:21 1185 3
REKLAMA
  • #1 18738231
    mariomario
    Poziom 18  
    Posty: 707
    Pomógł: 17
    Ocena: 140
    Cześć,

    chciałbym zoptymalizować kod aby wynikowo zajmował on mniej pamięci RAM w uC (kosztem większego zużycia Flash lub nawet EEPROM).
    Obecnie komunikaty wyświetlane na wyświetlaczu OLED zajmują mi największą część pamięci RAM. Poniższe "proste" komunikaty zajmują aż 93 bajty RAM (czyli aż 36% dostępnej pamięci RAM).

    Poniżej część kodu (IDE - MikroC PRO for PIC, uC PIC12F1840, wyświetlacz podpięty po I2C SSD1306):
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Pytanie do powyższego kodu: Jak/Czy da się jakoś "przenieść" te komunikaty wyświetlane na wyświetlaczu OLED (np. [ 50 ]) tak aby nie zajmowały aż tyle pamięci RAM i przenieść te komunikaty do pamięci Flash lub nawet EEPROM, której to zostało jeszcze sporo więcej niż RAM?
  • REKLAMA
  • Pomocny post
    #2 18738329
    JacekCz
    Poziom 42  
    Posty: 8670
    Pomógł: 760
    Ocena: 1461
    Jak kod kopiowałeś 12x, tak masz. Użyłeś algorytmu Copiego & Pasta, on taki jest.

    Jakbyś pomyślał, wychwycił zależność, pomnożył, dodał, w locie stworzył bufor, byś miał poważną oszczędność.
    Programowanie to domena myślenia, a nie kopiowania.

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


    Odkomentowując else masz nieco inne działanie.

    Na marginesie: plików .c się nie inkluduje, je się dołącza do projektu. Po drugie, nie wiadomo, jakie tam są syfki.
    Jeśli to jest plik oled_SSD1306.c jaki daje się znaleźć w sieci, to tragenia.

    Dodano po 6 [minuty]:

    Telex napisał:
    Witam,
    Definiujesz sobie makro:
    #define PGM_GETSTR( str, idx ) (char*)pgm_read_word( &str[ idx ] )

    A zmienne zmiennych tak:
    const char Text_1[] PROGMEM = "[10]";


    To jest projekt na PIC'a (i nieznanny mi kompilator), ty podajesz AVR.
  • REKLAMA
  • #3 18739237
    mariomario
    Poziom 18  
    Posty: 707
    Pomógł: 17
    Ocena: 140
    Dziękuję za podpowiedź*, też chciałem ubrać to jakoś w "mielenie w tablicy", ale zastanawiałem się jak to ugryźć.
    Dzięki twojej podpowiedzi zużycie tego kawałka kodu spadło z 93 bajtów RAM do zaledwie 11 bajtów RAM.

    W dalszym etapie optymalizacji chcę zająć się optymalizacją fontów (obecnie fonty 8x8) do mniej zajmujących RAM i Flash fontów 5x7. Da to pewnie dodatkowych kilkanaście - kilkadziesiąt bajtów.

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


    Moderowany przez Marek_Skalski:

    Usunąłem zbędny cytat całości postu poprzedzającego.
    Nie kopiujemy treści poprzednich postów. Jeżeli cytujemy, to fragment, a nie całość.

  • #4 18739244
    JacekCz
    Poziom 42  
    Posty: 8670
    Pomógł: 760
    Ocena: 1461
    Jak wybrałeś opcję ze spacją dla liczb<10, to można na stałych pozycjach wpisywać (2,3 ..6) , i++ nie jest konieczny (ale nie szkodzi)

    I nie pisz 48, pisz '0' - skad ten zwyczaj? On nic dobrego nie daje
REKLAMA