Witam! Biore sie powoli za pisanie biblioteki graficznej do AVR i pomyslalem, ze wykorzystanie obiektow i stworzenie czegos w stylu uproszczonego MFC byloby mile:) I tu sa problemy... AVR-gcc nie ma operatora new, z poszukiwan w necie dowiedzialem sie, ze ludzie zastepuja go przez malloc. Niby ok, ale to nie zadziala z obiektami majacymi metody wirtualne, bo nie inicjalizuje vtable instancji. Z kolei wykorzystanie takich metod w tym zastosowaniu wydaje sie byc oczywiste. Jak sobie z tym poradzic? Czy naprawde jedyna mozliwoscia jest sobie odpuscic? Pozdrawiam liczac, ze uslysze cos konstruktywnego:)
AVR i C++
Mar 18, 2006
8 Replies
Jestem wprawdzie poczatkujacym sprzetowcem, jednak mam wrazenie ze laczenie C++ z mikrokontrolerami które maja bardzo mala pamiec RAM wydaje sie byc nieporozumieniem (a juz napewno z 8051). Bycmoze z tego zalozenia wyszli autorzy AVR-GCC. W koncu malloc miesci sie w bibliotekach zwyklego C.
Moze trzebaby spróbowac rozwiazac problem w zwyklym C albo przesiasc sie na mocniejszy MCU, moze cos z rodziny ARM
Pawel
Akurat RAMu mam sporo, zreszta programowanie obiektowe wcale nie musi pochlaniac duzych ilosci pamieci. Tworcy AVRGCC najwyrazniej o new mysla, bo pewne zapowiedzi wprowadzenia pojawiaja sie w dokumentacji.
Z definicji kazdy problem obiektowy da sie rozwiazac programujac strukturalnie. Ale po co sobie utrudniac i zaciemniac obraz. Wlasnie po to wybralem sobie ATMega128, dodalem duzo pamieci itd. zeby wlasnie skorzystac z dobrodziejstw programowania obiektowego.
Pisze w C++ na arma, ale nie widze powodu zeby tego nie robic na mega128 - zwlaszcza jak masz zewn. pamiec np 32kB.
void* operator new(size_t size) {
void* m = pvPortMalloc(size); //if(!m) puts("out of memory"); return m; }
void operator delete(void* m) {
vPortFree(m); }
Potem trzeba jeszcze zadbac o wo³anie konstruktorow globalnych, itp itd.
Na avrfreaks poradzono mi cos takiego:
void * operator new(size_t size) { return malloc(size); }
void operator delete(void * ptr) { free(ptr); }
Czyli generalnie tak jak ty to robisz. Robiac object *o=new object(parametry) wydaje sie, ze konstruktor i co za tym idzie vtable jest wywolywany automatycznie. Goscie z avrfreaks to potwierdzaja:) Wiec wydaje sie, ze nic nie stoi na przeszkodzie, zeby tak robic. O jakich wywolaniach konstruktorow globalnych pisales? Nie rozumiem tego fragmentu. A BTW czym sie rozni malloc od pvPortMalloc?
1.Ja uzywam jeszcze dodatkowo freeRTOS'a wiec mam specjalny alokator zabezpieczony przed multitaskingiem. 2.Kazdy obiekt globalny( statyczny ) musi byc utworzony przed funkcj± main(). Wiec z poziomu asemblera trzeba je wywolac. na ogó³ robi sie to zaraz po wyzerowaniu sekcji .bss i zaladowaniu sekcji .data . Byc moze tworcy avr-gcc zadbali o to...
Bo AVR-GCC to kompilator języka C, a nie C++. Nie wiem, jak ludzie moga to mylic, a to jest niestety nagminne :(.
BTW - jak bardzo chcesz, to w C masz funkcje malloc (stdlib.h).
Bo AVR-GCC to kompilator języka C, a nie C++.
Jesli poczytasz manuala to zapewne dojdziesz do momentu, gdzie opisuja jak avr-gcc na podstawie np. rozszerzenia pliku automatycznie sprawdza czy ma do czynienia z C, czy C++ i podejmuje stosowne akcje. Maly hint - avr-g++ tez nie ma tych operatorow.
A przeczytales mojego posta, czy tylko tak ci sie wydawalo?
Join the Discussion
Have something to add? Share your thoughts — no account required.
Didn't find your answer?
Ask the community — no account required