logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[STM32F103][RAM] - Dostępność wolnego miejsca - runtime

betoven 20 Lut 2016 03:47 1224 8
REKLAMA
  • #1 15452737
    betoven
    Poziom 12  
    Posty: 108
    Ocena: 8
    Witam.

    Czy ktoś wie jak badać w runtime zajętość pamięci ?? Używam C++ i operatorów new/delete. Zakładam że obszar sterty i stosu jest przydzielany w taki sposób aby zminimalizować jego nałożenie się, czyli najprawdopodobniej na dwóch końcach pamięci RAM.

    Czy jest jakiś sprzętowy mechanizm ochrony tego obszaru ?
    Jak zbadać zajętość pamięci ?
  • REKLAMA
  • #2 15452814
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Posty: 13336
    Pomógł: 1712
    Ocena: 870
    betoven napisał:
    Czy jest jakiś sprzętowy mechanizm ochrony tego obszaru ?

    Nie ma.

    betoven napisał:
    Jak zbadać zajętość pamięci ?

    Stos można po resecie zerować i na tej podstawie analizować "dokąd" jest zajęty. Do sprawdzania stanu heap można wykorzystać funkcję mallinfo() jeśli używasz toolchaina z newlibem - zerknij tutaj https://www.elektroda.pl/rtvforum/topic3145651-30.html#15440836 , tylko doczytaj do końca tematu.
  • REKLAMA
  • #3 15452887
    BlueDraco
    Specjalista - Mikrokontrolery
    Posty: 6479
    Pomógł: 939
    Ocena: 421
    Jeśli chcesz, żeby urządzenie z niedużym mikrokontrolerem działało niezawodnie - nie używaj dynamicznej alokacji. ;)
    To są właśnie efekty stosowania paradygmatu obiektowego z wszystkimi jego odpałami , o których nie tak dawno dyskutowaliśmy...
  • REKLAMA
  • REKLAMA
  • #5 15453045
    BlueDraco
    Specjalista - Mikrokontrolery
    Posty: 6479
    Pomógł: 939
    Ocena: 421
    Zgoda, rzecz w tym jednak, że na ogół fani C++ żyć bez dynamicznej alokacji nie potrafią, bo jest to typowy, chociaż nieobowiązkowy składnik tej konwencji programowania (też już o tym było). A potem kłopoty... ;)
  • #6 15453171
    bgolab
    Poziom 22  
    Posty: 649
    Pomógł: 44
    Ocena: 100
    Jedną z technik uzywanych jest wpisanie patternów do pamięci i sprawdzanie cykliczne czy nie zostały nadpisane - znany pattern to np. "0xDEADBEEF". Zakładam, że wiem jaki obszar nie powinien być przekroczony np. jeśli nie panujemy nad wywołaniami rekurencyjnymi to stack może za bardzo się powiększyć i nadpisze nam nasz pattern.
  • #8 15455521
    betoven
    Poziom 12  
    Posty: 108
    Ocena: 8
    Co do przydzielania pamięci to faktycznie z tym trzeba uważać jak z "ogniem".
    Za Waszą namową zacząłem przepisywać (konkretnie kolejki obiektów) na wersję z buforem pierścieniowym (tak chyba się to nazywa) i po godzinie przepisywania natknąłem się mały fragmencik, który robił new a nie robił delete :D.
    Wróciłem do wersji pierwotnej programu, poprawiłem ten mały fragment i ... działa. Stress testy lecą już 10 min i nic się nie dzieje (poprzedni wywalał się po paru sekundach)....

    Jak to mówią, o jeden delete za mało :D Pozdrawiam i życzą wszystkim jak najmniej takich błędów.

Podsumowanie tematu

LABEL_AI_GENERATED
W dyskusji poruszono problem monitorowania zajętości pamięci w czasie rzeczywistym w kontekście programowania na mikrokontrolerze STM32F103 z użyciem C++ i dynamicznej alokacji pamięci. Użytkownicy sugerują, że nie ma sprzętowego mechanizmu ochrony pamięci, a do analizy stanu sterty można wykorzystać funkcję mallinfo() w toolchainie z newlibem. Zwracają uwagę na ryzyko związane z dynamiczną alokacją, zalecając unikanie jej w projektach z mikrokontrolerami. Proponowane techniki monitorowania pamięci obejmują wpisywanie wzorców do pamięci oraz stosowanie wskaźników unikalnych std::unique_ptr w C++11, co może pomóc w zarządzaniu pamięcią i unikaniu wycieków.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA