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

[ATMega][C/C++] dlaczego nie używa się cpp w atmegach?

Tomkiewicz 06 Sty 2009 20:26 2211 2
  • #1 5960603
    Tomkiewicz
    Poziom 13  
    Ostatnio zainteresowałem się programowaniem atmelków (kupiłem zestaw do nauki z atmegą 16) - zacząłem od C, jednak dość szybko zauważyłem, że wsród binarek jest kompilator C++ - i on rzeczywiście działa.

    W związku z tym dziwi mnie, że nikt nic nie pisze w tym języku na mikrokontrolery - coś jest z nimi nie tak? Co prawda jest trochę okrojony (nie działają wyjątki ani operator new), ale obiektowy kod jest mimo wszystko dużo czytelniejszy... A może coś przeoczyłem i się nadzieję, jak trochę dalej zajdę z nauką?
  • Pomocny post
    #2 5960765
    BoskiDialer
    Poziom 34  
    Tak, jest kompilator C++. Głównie chodzi jednak o to, że język ten w niektórych zastosowaniach powoduje nadmierne obciążenie procesora lub zużycie zasobów (przydzielanie obiektów wymaga obecności sterty). W przypadku mikrokontrolerów ze względu na częstotliwość zegara często bardziej zależy na wydajności niż przenośności kodu, a pisanie w C pozwala lepiej kontrolować zużycie zasobów. Jeśli koniecznie chcesz pisać program w C++, nie ma żadnego problemu. Nawet brak "new" da się obejść - implementujesz operator new oraz delete i już pojawia się "new":
    // wyciąg z pliku kernel.h z jednego z moich projektów
    #ifdef __cplusplus
    extern "C" {
    #endif
    /* Pamięć */
    /**
     * Przydziela blok pamięci na stercie
     * \param size Rozmiar przydzielanego bloku
     * \return Wskaźnik na przydzielony blok lub NULL jeśli nie udało się przydzielić bloku
     */
    void* malloc(unsigned int size) __attribute__((malloc, warn_unused_result));
    /**
     * Zwalnia blok pamięci
     * \param memptr Wskaźnik na blok pamięci na stercie
     */
    void free(void* memptr);
    
    
    // [CIACH]
    
    
    #ifdef __cplusplus
    } /* extern "C" */
    
    void* operator new(unsigned int s) __attribute__((always_inline));
    void* operator new(unsigned int s)
    {
    	return malloc(s);
    }
    void operator delete(void* p) __attribute__((always_inline));
    void operator delete(void* p)
    {
    	free(p);
    };
    #endif /* __cplusplus */

    C++ posiada swoje zalety, trzeba jednak zauważyć, że w przypadku mikrokontrolerów wady się również ujawniają. Jeśli masz dużo pamięci flash, dużo pamięci ram (dużo jest pojęciem względnym, zakładam, że dużo jest wtedy, kiedy nie brakuje) to nie ma żadnego problemu, jednak ja na uC preferuję C.
  • #3 5961031
    Dr.Vee
    VIP Zasłużony dla elektroda
    Dodatkowym kosztem jest to, że obiekty z metodami wirtualnymi "kosztują" dodatkowe 2 bajty (1 wskaźnik) na obiekt.

    Jeśli chodzi o new i delete, to można je osobno implementować dla każdej klasy - czyli obiekty pewnych klas można np. alokować z tablicy statycznej zamiast malloc-owania pamięci.

    Nawet bez obiektów C++ bez ma inne zalety (np. template'y, inicjalizację stałych dowolnymi wyrażeniami, tablice zmiennych rozmiarów alokowane na stosie).

    Na avrfreaks.net temat programowania AVR w c++ często powraca, razem z próbami definiowania statycznych metod inicjalizacji peryferiali itd.

    Ale tak czy inaczej ANSI C jest okopanym standardem i będzie jeszcze żyło długo, tym bardziej w programowaniu systemów wbudowanych.

    Pozdrawiam,
    Dr.Vee
REKLAMA