AVR i C++

Mar 18, 2006 8 Replies

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:)



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