STM32 Dinamik bellek yönetimi.

Başlatan Klein, 21 Mayıs 2014, 01:35:48

Klein

Bazı programlarda dinamik  bellek kullanmam gerekiyor. Özellikle bağlı listeler kullanmam gerektiğinde, dinamik bellek kullanmadığım için yan yolları dolaşmam gerekiyor.
Yakında Tüm programları C++ ile yazmayı düşünüyorum. O zaman daha da  fazla kullanmam gerekebilecek.

Dinamik belleğin getirisini az çok görebiliyorum. Ama götürüsü ne olacak ona pek emin değilim.
STM32F103C6T6 gibi kontrolcü için dinamik bellek yönetimine geçmenin sıkıntıları neler olabilir.

Önerir misiniz? Önermez iseniz neden önermezsiniz?

mufitsozen

Alıntı yapılan: gerbay - 21 Mayıs 2014, 09:49:56
yaptığını projeye göre önerilir ya da önerilmez ama sizin ya da bu forumdaki herhangi birinin kullanmasının sakıncalı olacağını düşünmüyorum.

götürüsü şu olur;  eğer çok kritik zamanlamalar ile çalışıyorsanız ve yaptığınız sistem 7 gün 24 saat 365 gün kesintisiz çalışması gereken bir sistemse sistemde ilk açıldıktan bir süre sonra zamanlamalar ile ilgili jitter lar oluşabilir.

bunun kaynağı dinamik memory yönetimi. genelde bunun için ya linked list tarzında ya da tree, btree vb. veri yapıları kullanılıyor. siz sürekli memory alıp verikçe heap de fragmentation oluyor. siz tekrar hafıza istediğinizde memory manager in tüm veri yapısını dolaşma ihtimali oluşuyor bu da süreyi uzatıyor.  yani sistem yeni açıldığındaki bir "new" ya da "malloc" çağrınızın döndüğü süre ile bayaa bir çalışmış bir sistemde yapılan "new" ya da "malloc" çağrısı aynı zamanda dönmüyor. tabi bu konuda en önemli şey memory manager kodunun çalışma şekli ve kalitesi..


+1000

Genellikle dinamik hafiza kullanimi gomulu sistemlerde izin verilmeyen bir durumdur. Fakat proje sorumlulari bu kurali COOOKKK gecerli bir mazaret var ise sorumlulugu uzerlerine alarak override edebilirler (kariyerlerini bitirme/isten atilma riski ile)  ama bu durumda bile malloc gibi degisik boylarda bellek ayıran bir sistem yerine sabit boyda buffer kullanilan sistemler tercih edilir. ornegin 1 byte da gerekse 100 byteda hep 128 byte buffer verilir. boylecek hem hiz hemde fragmentation gibi dezavantajlar onlenir.
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

oyaz

Bu konu benim de ilgimi çekiyor fakat çok fazla bilgim yok. Bildiğim kadarıyla dinamik bellek yönetimi ile çalışma sırasında kullanılmayan bellek alanı sisteme verilip, ihtiyaç halinde tekrar alınabiliyor. o çağırdığımız bellek alanının başka bir birim tarafından kullanılıp kullanılmadığı vs. nasıl test ediliyor ? 
Become a learning machine...

AsHeS

Alıntı yapılan: gerbay - 21 Mayıs 2014, 13:30:31
dinamik memory için ayırdığınız alanı kontrol eden bir mekanizma var runtime-library içerisinde. siz bellek istediğinizde bu mekanizma nereden ne kadar bellek verdiğini işaretliyor. siz geri verdiğinizde tekrar verdiğiniz alanı boş olarak işaretliyor. bu şekilde bellek alma/verme rutinleri hep aynı kontrol mekanizmasından geçirilerek yönetiliyor
Hocam bir struct yazsak bu structın içinde 2 kB lık bir alan ayırsak structın içerisinde başlangıç, bitiş adresi ayrıca kullanım miktarı bulunsa yine aynı structın içine allocate ve deallocate fonksiyonları bulundursak, run-time library kullanmadan kendi çakma dinamik bellek yönetimimizi yapabilir miyiz ?
Allocate bize başarılı ise olduğunu bildirse ve başlangıç pointerını döndürse, deallocate de hakeza aynı şekilde çalışsa ne dersiniz bu duruma ?
Örnek
struct __attribute((packed)) dynamic_mem_s
{
uint8_t   dm_memory[2048];
uint32_t dm_start_addr;
uint32_t dm_finish_addr;
uint32_t dm_usage_len;
allocate_func *dm_allocate_func;
deallocate_func *dm_deallocate_func; 
};

AsHeS

Alıntı yapılan: gerbay - 21 Mayıs 2014, 13:48:51
hocam farklı farklı yerlerden bir sürü allocation yapıldığını düşünün. daha sonra da aradan rastgele bir kaç tanesinin deallocate edildiğini düşünün.
Anladım hocam boşlukların da ayrı bir yerde tutulması gerekiyor.
Aslında yapmak istediğim run-time library den kurtulmak.

mufitsozen

Alıntı yapılan: gerbay - 21 Mayıs 2014, 13:48:51
@Klein,

hocam C++ yazmak dinamik bellek kullanmaya mahkum olmak anlamına gelmiyor zaten. Class ların instance larını da normal değişkenler gibi düşünün. isterseniz dinamik yaparsınız, isterseniz static olarak data segment e gömersiniz, isterseniz local değişken gibi kullanabilirsiniz..

C++ açısından sıkıştıran bir durum yok

himmm accessibility ve visibility rule'larini hatim etmis olmak gerekir netekim (C++ object modelini hic soylemiyorum korkmasinlar diye..) yoksa ilmi hikmetten demek isterken kilimi kim caldi mektepden diyen bir program ortaya cikiverir istemedende olsa...

Hem herkes @gerbaymi? :-)

Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

picusta

Birkaç senedir artik bütün gömülü projelerde C++ kullaniyorum (8 bit islemci).
Bundan önce malloc kullanmadan dinamik hafizayi simüle eden struct tablolari da yaptim (1 tablo header, digeri verileri sakliyor).
Gerbay'in dedigi gibi siniflarin dinamik olma mecburiyeti yok.
MISRA-C kurallarinda dinamik bellek yasak, ama MISRA-C 'ye uygun kod yazmiyoruz dimi?

Son yaptigim programda main döngüsünde her sefer 5 nesne new ve delete ediyorum +  Gelen mesajlari linked list'e kaydediyorum ,ve siliyorum.
4 haftadir dönüyor, hafiza kaçagi yok (bos kalan RAM'i izliyorum), yavaslamada yok. Topu topu 2K RAM var.

STM32 için C++ compiler  ? GCC ?



Klein

C++ için dinamik bellek zorunlu değil. Ama kafamda kurduğum bir kaç temel sınıfta sınıfta dinamik bellek kullanmam gerekiyor. Bu sınıfları da neredeyse tüm programlarımda kullanmayı düşündüğümde, dinamik bellek yönetimi  benim için zorunluluk haline gelecek.

Özellikle görev yöneticiler yazarken,  bağlı listeler işimi çok kolaylaştıracaktı. Bunun yanında programdaki tüm zamanlamalar için de timer sınıfı yazıp, ihtiya olduğunda nesneyi oluştur, işin bitince serbest bırak şeklinde çalışmayı planlıyordum.  Ama gördüğüm kadarıyla , kaş yapayım derken , göz çıkarma ihtimali de yüksek.

Bu hayali biraz zamana yaysam iyi olacak sanırım. 

Klein

Evet. Gittiği yere kadar böyle devam etmek akıllıca görünüyor.

Burak B

Memory Pool kullanabilirsiniz. İhtiyacınıza göre adetleri belli olmak kaydıyla değişik boyutlarda aligmentasyonu düzgün havuzlar oluşturup. İhtiyaç duydukça bu havuzlardan sizin isteğinize en uygun ebatta olanı alıp kullanıp sonra iade edersiniz.

Örnek bir kullanım için lwIP' nin Cutom Mem Pools kullanımına bakabilirsiniz.
"... a healthy dose of paranoia leads to better systems." Jack Ganssle