[avr-gcc] przydzial pamieci

Jul 12, 2004 8 Replies

Witam wszystkich



Pisze duzy programik na mega128 z zewn ram 32k. bo potrzebuje duzo roznych buforow. Czy Waszym zdaniem moge korzystac z malloc() i free()? uklad bedzie odbieral po rs485 i po spi ramki roznej dlugosci ( od 32 do prawie 250 bajtow) i skleja³ w jeszcze wieksze czasami. Jakie jest ryzyko ¿e ram sie zdefragmentuje? Albo jak temu zapobiec? Czy pozostawienie zawsze np 25% wolnego ramu moze pomóc? Ktos ma doswiadczenia z dynamiczna pamiecia?



Z gory dzieki za wszelkie porady. jfk



Czesc, zobacz m.in.

formatting link

Spore.

Nie.

Nie stosowac dynamizmu. transmisje ? To moze bufory kolowe - tzn jeden obszar wykorzystywany w kolko pod bufory - bo o ile rozumiem dane sie dosc szybko dezaktualizuja ..

J.

Bufor ko³owy jest zbyt prosty - to nie moze byc zadne fifo lifo itp. bo zwalnianie moze byc w roznej kolejnosci. Myslalem raczej o wlasnym mallocu: jakies duze tablice i przydzielanie zawsze n*x-bajtow, gdzie n =32 lub np 64 tylko ze czasem bedzie potrzeba np 5 bajtow a czasem 255.

pozdr. jfk

Z linka podanego przez Jurka wynika ¿e zostawienie czesci pamieci zawsze wolnej jednak moze pomoc. Tylko pewnie trzeba wiecej niz 25% ;-( Autor malloca twierdzi poza tym ze i tak malloc jest najefektywniejszym wykorzystaniem pamieci.

Dzieki wszystkim jfk

W artykule <ccvthb$ekt$ snipped-for-privacy@inews.gazeta.pl> autorem którego mieni się jfk, napisano:

Przydzielać zawsze 255 ? O ile pamięci starczy ...

Inna możliwość to defragmentacja w razie potrzeby. Problemem jest tu konieczność przesunięcia bloków, które uniemożliwiają wykonanie żądanego przydziału. Wskaźniki do tych bloków, jeśli są zapamiętane gdzieś w programie (a są, bo to jest istota działania malloc'a), staną się nieważne.

Jedno z wyjść to obsługa przydziału w oparciu o uchwyty bloków pamięci: funkcja przydziału zwraca identyfikator bloku (nie adres) który nie zmienia wartości mimo przemieszczania bloku w pamięci podczas defragmentacji.

Aby uzyskać adres, blok trzeba unieruchomić (wtedy zarządca pamięci nie może go przesunąć), a po użyciu - znowu uruchomić.

Drugie wyjście to użycie master-pointera. Zarządca pamięci uaktualnia zawartość tego wskaźnika w razie przesuwania bloków. Oczywiście kopie tego wskaźnika mogą stać się nieważne.

Po przeczytaniu watku: a dlaczego nie napisac wlasnego alokatora dzialajacego wg. strategii blokow blizniaczych?

S_fragmentuje_, defragmentacja, czyli scalanie, to korzystne zjawisko. :-)

Ja, ale zanim zaczniemy o tym rozmawiac, przeczytaj sobie to:

formatting link
Pozdrawiam Piotr Wyderski

On Fri, 16 Jul 2004 14:08:06 +0200, "Piotr Wyderski" snipped-for-privacy@ii.uni.wroc.pl> wrote: [.....]

A co to za algorytm? Czy chodzi o to co anglosasi nazywają buddy system(s)?

Regards, /J.D.

Tak, w najprostszej wersji chodzi o rekurencyjny podzial blokow o wielkosci 2^n bajtow na pary "blizniakow" -- sasiadujacych ze soba blokow o dwa razy mniejszym rozmiarze. Ma to pewne wady (ale nieistotne w tym zastosowaniu), wiec wymyslono tez lepsze wersje.

Pozdrawiam Piotr Wyderski

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required