Sprawdzenie poprawności alokacji pamięci

0

Posiadam mikrokontroler z 32kB pamieci RAM. W ramach nauki alokuję 20000B pamięci co kończy się sukcesem i zapala się dioda zielona.


double * d = NULL;
d = (double*)malloc(20000);
if(d != NULL)
{
    LED_OFF(BLUE);
    LED_OFF(ORANGE);
    LED_OFF(RED);
    LED_ON(GREEN);
}
else
{
    LED_OFF(BLUE);
    LED_OFF(ORANGE);
    LED_ON(RED);
    LED_OFF(GREEN);
}

Przy próbie alokacji 40000 bajtów mikrokontroler się zawiesza i nie zapala się czerwona dioda, wydaje się to oczywiste. Czy istnieje jakiś mechanizm aby zapobiec takiej sytuacji? Wg mnie powinno być tak, że mcu nie zaalokuje w ogóle tego bloku pamięci, funkcja malloc zwróci NULL, zapali się czerwona dioda, i MCU będzie działał dalej. Dlaczego tak się nie dzieje? Potrzebny jest do tego OS?
2

Jest jakaś szansa żebyś podał model tego sprzętu, nazwę kompilatora i jego wersję i środowisko uruchomieniowe żebyśmy mogli to za Ciebie wyguglać?

0

Guglowałem, ale nic nie znalazłem, przeczytałem na jednym forum, że bez OS'a jest to nie możliwe.
MCU STM32F401
IDE CooCox
kompilator GCC arm

0

Jak alokujesz więcej niż jest dostępne pamięci to mogą wystąpić problemy, zrób własną implementację malloc() i monitoruj ile pamięci możesz, a ile masz już zaalokowane i blokuj próby alokacji powyżej dostępnego limitu. Masz 32kb, alokujesz 39kb i zaskoczony, że coś nie działa :)

1

Prawdopodobnie leci przerwanie hardfault bo program odniósł się do pamięci, której nie ma. malloc nie wie ile pamięci ma procesor, on po prostu alokuje tyle ile chcesz, a potem jest kwiatek.

Generalnie jak naprawdę tego nie potrzebujesz to nie używaj malloc w systemach embedded. Niesie to za sobą wiele problemów a zysków jest bardzo mało. W embedded raczej stosuje się alokację na stosie albo statyczną. Jeżeli naprawdę potrzebujesz dynamicznej alokacji, to wtedy się pisze swoje własne alokatory, ponieważ malloc jest zwyczajnie wolny.

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0