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

[AVR][C] - próba kodowania w C++, ale...

mirekk36 16 Lis 2009 20:38 2632 15
  • #1 7269901
    mirekk36
    Poziom 42  
    Witam,

    Chciałbym raczej tak z czystej ciekawości spróbować na jakimś większym procku typu Atmega64 tak czysto dla efektów poznawczych wypróbować jak się programuje w C++ . Na razie nie jest istotne dla mnie czy to jest opłacalne czy nie bo jak mówię tylko próba ....

    ale.... przy okazji mam pytanie związane z C++ (może troszkę nawet w oderwaniu od tematu wątku narazie)

    Czym się różni wskaźnik od referencji???

    tzn kiedyś wydawało mi się, że to jest jedno i to samo ale chyba okazuje się, że nie.

    Wiem, że wskaźnik zawiera po prostu adres do obiektu na który wskazuje i zwykle związany jest z typem tego obiektu. Wiem jak się przekazuje np parametry do funkcji za pomocą wskaźnika. Wiem, że można je przekazywać za pomocą referencji używając operatora & przed nazwą przekazywanego obiektu czy zmiennej. No ale to chyba też jest po prostu przekazanie tylko adresu do tego obiektu.

    Chyba że ta różnica może polegać tylko na tym, że wskaźnik można po prostu zdeklarować a referencję wykorzystać tylko np do przekazywania parametrów. Czy dobrze myślę???? spędza mi to sen z powiek ;)
  • Pomocny post
    #2 7270049
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Różnica jest taka, że referencję są bezpieczniejsze. Do wskaźnika możesz sobie przypisać dowolną wartość, referencję MUSISZ (a nie "możesz") ustawić tylko raz (nie można jej potem zmienić) i tylko na konkretny obiekt.

    Parametr przekazany do funkcji przez referencję jest więc zawsze dobry, a ten przekazany przez wskaźnik trzeba testować, czy np nie jest równy 0, czy obiekt jest poprawny itp.

    O tym, że referencję obsługujesz tak jak instancję, a nie wskaźnik (czyli referencja += 2, a nie *wskaznik += 2) zapewne wiesz.

    A tak naprawdę to i referencje można oszukać, ale to już trzeba się postarać <:

    4\/3!!
  • Pomocny post
    #3 7270308
    tmf
    VIP Zasłużony dla elektroda
    Moze cie to zainteresuje:
    http://www.embedded.com/story/OEG20010311S0024

    Co do C++ na mikrokontrolerach - znajdziesz duzo negatywnych opinii pisanych przez ludzi, ktorzy nigdy w C++ nie pisali, lub tego jezyka nie znaja, ale wydaje im sie, ze sa guru :) Wiec powodzenia.
  • #4 7270395
    mirekk36
    Poziom 42  
    Freddie Chopin napisał:
    Różnica jest taka, że referencję są bezpieczniejsze. Do wskaźnika możesz sobie przypisać dowolną wartość, referencję MUSISZ (a nie "możesz") ustawić tylko raz (nie można jej potem zmienić) i tylko na konkretny obiekt.


    sorry tylko jeszcze dopytam, bo rozumiem to, że do wskaźnika mogę sobie przypisać dowolną wartość, że trzeba go sprawdzać itd ..... jakiś wskaźnik definiuję sobie np tak:

    jaks_obiekt *wsk;

    ale czy to oznacza, że również w jakiś sposób można zdeklarować sobie referencję do obiektu? jeśli tak? to jak? (czy jednak można tylko przekazywać jakiś obiekt przez referencję?

    Dodano po 1 [minuty]:

    sorki w linku od kolegi tmf już zobaczyłem że można ją zdeklarować :

    jakis_obiekt &ref;

    ;) chyba dobrze zrozumiałem ?
  • Pomocny post
    #6 7270733
    tmf
    VIP Zasłużony dla elektroda
    Z ta mala poprawka, ze to musi byc: jakis_obiekt &ref=obiekt;
    Referencje mozesz traktowac jako stala (const) i nie mozesz pozniej zmieniac na co wskazuje, stad wymog, ze przy definicji referencji musi ona byc jednoczesnie inicjalizowana (w przeciwienstwie do wskaznika, nawet wskaznika typu const, ktory moze wskazywac na null, czyli niepoprawny obiekt). Da sie to obejsc, ale lepiej nie probowac :)
  • Pomocny post
    #7 7271004
    Dr.Vee
    VIP Zasłużony dla elektroda
    Referencje są ułatwieniem ale tylko na etapie kompilacji - "pod maską" są implementowane jako wskaźniki. Można np. wykonać:
    int* wsk = new int(1);
    int& ref = *wsk;
    delete wsk;
    ref = 123; // "wisząca" referencja - zapis do zwolnionej pamięci

    Prosta reguła jest taka - jeśli obiekt może być niezdefiniowany, to użyj wskaźnika, w przeciwnym przypadku użyj referencji :)

    Pozdrawiam,
    Dr.Vee
  • #8 7271006
    mirekk36
    Poziom 42  
    no tak teraz już chyba wiem wszystko o czym chciałem się dowiedzieć, bardzo dziękuję za odpowiedzi i linki do poczytania ;)

    to jest dobre ;) tzn dobra regułka, która uzmysławia dobrze kiedy i jak warto posługiwać się referencją a kiedy wskaźnikiem
    Dr.Vee napisał:

    Prosta reguła jest taka - jeśli obiekt może być niezdefiniowany, to użyj wskaźnika, w przeciwnym przypadku użyj referencji :)
  • #9 7271489
    Konto nie istnieje
    Konto nie istnieje  
  • #10 7271743
    tmf
    VIP Zasłużony dla elektroda
    Wyobraz sobie, ze 90% kodu ktory pisze na mikrokontrolery jest w C++.
    Druga rzecz - trzeba odroznic jezyk, jego implementacje w kompilatorze i biblioteki standardowe z tym jezykiem zwiazane, a tu wiele osob ma problem.
    I konkretnie:
    1. Nie wiem co robia tworcy IAR, bo nie uzywam tego kompilatora i ich pomysly mi powiewaja.
    2. Ja zadam pytanie inaczej - jest jakis sposob, zeby windows 7 zajmowal 10kB? Zaimplementuj podobna funkcjonalnosc w C i wtedy pogadamy o zajetosci pamieci. Inna sprawa, ze libstdc++ nie ma portu na AVR, z drugiej strony libstdc ma port tez mocno ograniczony w stosunku do pierwowzoru - ot taka specyfika kontrolerow.
    3. Konkretnie jakich nie mozna wykorzystac? Bo piszac na AVR korzystam z klas, funkcji wirtualnych, dziedziczenia wirtualnego, szablonow i innych dobrodziejstw C++.
    4 i 5. bo to jeden temat. Odpowiedzia jest rozdzielna alokacja pamieci klasy i inicjalizacja obiektu (wlasciwie inicjalizacje mozna wtedy pominac, bo w podanych przykladach nie ma co inicjalizowac). Standardowy operator new to umozliwia. Z tym, ze w zaleznosci od architektury moze to byc trudniejsze - np. na AVR trzeba sie nabiedzic, bo gcc nie wspiera const we FLASH.

    A poza tym naprawde nie interesuje mnie kto w jakim jezyku programuje i z jakich powodow. Takze jakies swiete wojny i ich wynik jest dla mnie bez znaczenia. Wlasciwie to nawet jestem zainteresowany, zeby ludzie wybierali totalnie beznadziejny jezyk, dzieki czemu moge napisac program w pare dni, ktory oni napisza w ciagu miesiecy.
  • #12 7271803
    mirekk36
    Poziom 42  
    tmf napisał:
    3. Konkretnie jakich nie mozna wykorzystac? Bo piszac na AVR korzystam z klas, funkcji wirtualnych, dziedziczenia wirtualnego, szablonow i innych dobrodziejstw C++.


    wow - po takich słowach to już na pewno muszę popróbować. Ponieważ dopiero co uczę się C++ i właśnie się niedawno naczytałem o polimorfiźmie, szablonach itp ... co dla mnie jest z jednej strony szokiem po wieloletnim programowaniu w (dzisiaj już mogę powiedzieć z żalem) biednym Delphi. Toż C++ ma gigantyczne możliwości ;) i myślałem też że takie programowanie to raczej tylko i wyłącznie co najmniej od jakichś ARMów i wyżej. A tu kolega pisze , że na AVRkach

    Ja podobnie uważam, że jeśli dane mi będzie skorzystać w projektach z tych "bajerów" jakie C++ podaje jak na tacy - to objętość kodu nie będzie miała czasami takiej wagi - oczywiście zakładając, że mam pod dostatkiem dla moich tego typu potrzeb odpowiednio dużą ilość pamięci Flash - i nie korzystam z procka typu np ATtiny15 ;) - bo na nim napisałbym oczywiście w zwykłym C

    OK - a możesz mi kolego tmf - tak w kilku zdaniach podpowiedzieć na co zwrócić uwagę - gdy chciałbym zacząć pisać projekt w C++ dla AVRka w GCC ??? czy może też jakiś link?

    byłbym wdzięczny
  • #13 7271852
    Konto nie istnieje
    Konto nie istnieje  
  • #14 7272181
    tmf
    VIP Zasłużony dla elektroda
    Freddie Chopin napisał:
    Ale odpowiedź... Nie powiem żebyś "zapunktował" takim tekstem...

    4\/3!!


    No coz, gdybym chcial zapunktowac to zostalbym politykiem :)
    Niemniej uwazam, ze merytorycznie odnioslem sie do problemu, czyli jest ok. A swietych wojen nie lubie, nie widze sensu w udowadnianiu komus, ze cos co lubi jest be i powinien polubic to co ja lubie bo to jest ok.

    Co do reszty pytan - kod w C++ wcale nie musi byc dluzszy, trzeba uwazac - np. na tworzenie obiektow tymczasowych, ktore dla poczatkujacego moze byc koszmarem i na styl pisania. Generalnie warto szczegolnie w C++ przemyslec hierarchie klas, metody, rozdzial i przeplyw danych pomiedzy klasami, zeby potem nie tworzyc potworkow na kolanie. Trzeba tez uniknac pokusy poczatkujacego mnozenia bytow - niepotrzebne klasy, wielokrotne dziedziczenia. Warto tez sie zastanowic czy tez C++ w realizacji konkretnego problemu naprawde jest potrzebne. Ale potem zyskuje sie czytelny kod, sprawny i funkcjonalny.
    Poczatki na AVR sa szczegolnie nieciekawe, bo jak pisalem nie ma wlasciwie zadnego wsparcia ze strony tworcow portu na AVR, chociaz standardowe biblioteki dzialaja, a po zgloszeniu problemow z C++ sa one naprawiane (vide np. ATOMIC_BLOCK). Na poczatek polecalbym przeczytanie watku avr-c++ micro how-to na avrfreaks (sticky w dziale gcc). Znajdziesz tam wszystko co powinienes wiedziec, zeby zaczac przygode z C++ na AVR.
  • #15 7272214
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Jak zacząć przygodę to pewnie większość wie, problemem jest to, że często po prostu utkniesz na problemie który niby jest prosty, ale jednak rozwala wszystko co sobie założyłeś. Ostatnio np stwierdziłem, że choć dla ARM wsparcie dla C++ jest, to lepiej nie przesadzać, bo dotknięcie dowolnej fajnej rzeczy w C++ (iteratory, string, itp) kończy się natychmiastowym przyrostem kodu o 60kB, bo wciągana jest obsługa wyjątków, gdyż tak skompilowana została biblioteka newlib.

    http://www.codesourcery.com/archives/arm-gnu/msg02941.html

    Faktem jest, że aby zmieścić wszystkie "fajne ficzery" C++ w mikrokontroler (w którym jednak istnieje coś takiego jak pamięć nie-zapisywalna i nie ma w nim kilkuset MB pamięci operacyjnej) wymaga czasem naprawdę niezłej gimnastyki.

    4\/3!!
  • #16 7273432
    KowalD
    Poziom 17  
    mirekk36 napisał:
    [...]i nie korzystam z procka typu np ATtiny15 ;) - bo na nim napisałbym oczywiście w zwykłym C
    akurat attiny15 nie ma pamieci ram i pisanie programu w c dla niego nie jest takie oczywiste :)... ale attiny13 bylby tu super przykladem :)...

    ja pisze w c++ program w crossworks for ARM... i nie narzekam :)... fakt, ze biblioteki nie sa do konca super... ale jakos mnie to bardzo nie przeszkodzilo (program nie jest bardzo skomplikowany :D)... a jakos nie moge sobie przypomniec jak myslalo sie nie obiektowo ;), wiec c++ to super ulatwienie :)...
    a, ze niedlugo bede musial pisac program dla AVR to sie zastanawiam nad c++... poszukalem i troche sie zniechecilem, bo tu: http://www.nongnu.org/avr-libc/user-manual/FAQ.html#faq_cplusplus napisali, ze np operatory new i delete nie sa zaimplementowane... ale skoro jakos idzie to pisanie, wiec chyba sie skusze :)... no i poczytam takze co na avrfreaks napisali :)...
REKLAMA