Wpis z mikrobloga

Mirki z #programowanie potrzebuje wskazówki.
Muszę zorganizować takie prymitywne zarządzanie pamięcią. Mam uC (4kB ramu) oraz kostkę 128kB ramu (nazwijmy to ERAM).
Najprościej mówiąc potrzebuje takich funkcji malloc i free, (albo new i delete) dzięki którym będę mógł wykorzystać całą dostępną pamięć ERAM a przy tym nie zużyć całej dostępnej pamięć uC.
Pomysł mam taki: zorganizować pamięć ERAM w bloki po 256 bajtów. w uC będę przechowywał adres początku bloku (2 bajty), rozmiar typu (1 bajt) i offset by wiedzieć, gdzie w tej tablicy aktualnie się znajdujemy (1 bajt). W sumie na przydzielenie jednej struktury zużyję 4 bajty pamięci, co przy maksymalnym przydziale pamięci zużyje mi 2kB pamięci uC i jednocześnie pozwoli na przydział do 512 indywidualnych bloków pamięci.
Można napisać klasę i przeciążyć operatory dostępu [] i () tak, by znały rozmiar zaalokowanego elementu i zwracałyby od razu właściwą porcję danych z surowych komórek pamięci ERAM.
Jednocześnie będę mógł zadbać o nienaruszalność bloków oraz ewentualnie napisać "systemową" funkcję, do przenoszenia bloków tak, by tworzyły ciągłe obszary pamięci ram. Na te i na inne potrzeby systemu, który buduje przeznaczę kilka bloków pamięci ERAM.
Mireczki, teraz wasza kolej, na sugestie, uwagi, czy można to zrobić lepiej?
Szybkość nie jest najważniejsza, ważne jest by było wygonie.


#kalkulatoranalityczny

  • 2
Napisz odpowiedni skrypt lokatora (zwany bardziej popularnie skryptem linkera) a potem możesz już przeciążyć operator new/delete albo napisać własne odpowiedniki funkcji malloc, free które w zasadzie będą tylko wrapperami dla oryginałów z zaznaczeniem w których sekcjach wymienionych w skrypcie lokatora dane mają być alokowane (jak to zrobić, musisz dokopać się w dokumentacji twojego kompilatora/linkera, bo nie jest to ustandaryzowane).

Wydaje mi się to najprostszym rozwiązaniem (zakładając że nie przejmujesz się defragmentacją pamięci
@Analityk: Zależy jak prosty ma być ten alokator. Ale przy prostym przydałaby się jeszcze informacja o zajętości pamięci. Taki prosty kołowy alokator jest jednak niebezpieczny i możliwe będą defragmentacje - przerabiałem to jakis czas temu... Opakowanie w klasę, przeciążenie operatora new i delete to najprostszy element całości, to, aby działało to rozsądnie, szybko (w moim przypadku jeszcze w watkach) jest wyzwaniem. Dodatkowo u mnie istotne bylo wyrównanie adresu przy zmiennych typu