Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

STM32 (Cortex M3) - Dynamiczna alokacja pamięci

toch88 13 May 2013 20:26 2829 16
Computer Controls
  • #1
    toch88
    Level 11  
    Witam

    Mam dosyć spory problem z parsowaniem tekstu, mianowicie użytkownik może w terminalu wpisać sobie taką o to składnie.

    Silnik 3,5;Silnik 5,25;Silnika 7,45;

    Ma to podzielić na "Silnik 3,5" , "Silnika 5,25" itp;


    Robię to w następujący sposób:
    -gdy z USARTa przychodzi ciąg znaków zakończonych znakiem '\0' wychodzi do przerwania gdzie tworzona jest tablica (buforRx) przesłanych znaków, przekazywanych dalej do pętli głównej:

    Code: c
    Log in, to see the code


    W pętli głównej obsługa tego wygląda tak:
    MAIN
    Code: c
    Log in, to see the code


    Po krótce dzięki temu kodowi bd miał:

    (PRZED wywołaniem CreateChild)
    tprs->string[0]="Silnik 3,5"
    tprs->string[1]="Silnik 5,25"
    tprs->string[2]="Silnika 7,45"

    wszystko ładnie pięknie teraz tworze "dzieci"

    (Wywołanie createChild)

    na podstawie każdego ze stringów dzielę wq kryterium " ":
    po takim sparsowaniu mam:

    tprs->child[0]->string[0]="Silnik"
    tprs->child[0]->string[1]="3,5"

    tprs->child[1]->string[0]="Silnik"
    tprs->child[1]->string[1]="5,25"

    Dobrze tak wyglądają funkcje:
    Inicjująca
    Code: c
    Log in, to see the code


    Tworząca dzieci

    Code: c
    Log in, to see the code



    Teraz pytanie w jaki sposób zwolnić tą pamięć przed przybyciem paczki do parsowania? Mam napisane coś takiego ale niestety HardFault_Handler
    Code: c
    Log in, to see the code


    tak wygląda deklaracja structury
    Code: c
    Log in, to see the code

    Bardzo proszę o pomoc naprawdę próbowałem wielu rzeczy, ale może mój zamysł w ogóle jest niepoprawny stąd te ceregiele. Wydaje mi się że to sprawa źle zwalnianych wskaźników bo w pewnych przypadkach program działa tzn kilka razy odbierze i przerobi polecenia, a np za 3 -4 się wysypie ;/

    Pozdrawiam.
  • Computer Controls
  • #2
    stanleysts
    Level 27  
    tprs->child = (struct TPARSER**)malloc (sizeof(TPARSER)); //dynamiczna allokacja pamieci

    To jest chyba źle, alokujesz rozmiar pamięci o wymiarach sizeof(TPARSER) a potem pod te wskaźniki dajesz znów malloc, nie powinno być coś w stylu?:

    tprs->child = (struct TPARSER**)malloc (sizeof(TPARSER*)*ElementsOfTab);
  • #3
    toch88
    Level 11  
    Tak to prawda dzięki :) już działa lepiej aczkolwiek widzę że dalej przy którejś pętli wiesza się przy tworzeniu dziecka
    Code: c
    Log in, to see the code


    jakby mu brakowało pamięci albo wchodził na zapisany wskaźnik ;/ hmm w jaki sposób móglbym to sprawdzić w keilu ?
  • #4
    BlueDraco
    MCUs specialist
    Fajny przykład na to, do czego nie powinno się używać dynamicznej alokacji. Wiesz, że procedury alokacji i tworzone przez nie struktury danych zajmują w tym przypadku prawdopodobnie więcej pamięci niż alokowane przez Ciebie dynamicznie dane?
  • Computer Controls
  • #5
    toch88
    Level 11  
    Czyli jeżeli dobrze rozumiem, powinienem zrezygnować z tego pseudo-obiektowego podejścia na rzecz czegoś, bo kurde nie specjalnie wiem jak do tego się zabrać, na myśl przychodzi mi jeszcze coś na zasadzie stosu.
  • #6
    stanleysts
    Level 27  
    Wogóle skąd masz implementacje tych funkcji dynamicznej alokacji pamięci?
  • Helpful post
    #8
    stanleysts
    Level 27  
    Chodzi mi jak na stm zaimplementowałeś/skad wziales funkcje malloc/free.
  • #9
    toch88
    Level 11  
    dołączyłem bibliotekę stdlib.h
    czy ona jest różna dla każdego mikroprocesora i powinna być implemenotwana na nowo ?

    Dodano po 6 [minuty]:

    w pliku h wygląda ona tak
    Code: c
    Log in, to see the code
  • #10
    Freddie Chopin
    MCUs specialist
    toch88 wrote:
    Czyli jeżeli dobrze rozumiem, powinienem zrezygnować z tego pseudo-obiektowego podejścia na rzecz czegoś, bo kurde nie specjalnie wiem jak do tego się zabrać, na myśl przychodzi mi jeszcze coś na zasadzie stosu.

    Nie słuchaj maruderów - jak potrzebujesz dynamicznie i masz odpowiednio dużo RAMu to nie ma co kombinować (; Czemu po prostu nie zrobisz tego wszystkiego przy użyciu scanf()?

    Twój problem wynika zaś z tego, że to wszystko masz nadmiernie skomplikowane... Mnogość dziwnych rzeczy zaciemnia obraz.

    4\/3!!
  • #11
    toch88
    Level 11  
    Proszę o jakiś example z tym scanf - swoją drogą wydawało mi się że te funkcjie typu printf i scanf to już wgl są beznadziejne jeżeli chodzi o optymalne rozwiązanie, dlatego raczej stroniłem od ich używania.

    Możliwe po przejściu z PHP gdzie o nic się nic nie martwiło tutaj, trzeba myśleć bardziej hmm o wszystkim.

    Nie mniej jednak jestem chyba w punkcie gdzie lepiej by było napisać wszystko od nowa .
  • #12
    Freddie Chopin
    MCUs specialist
    toch88 wrote:
    Proszę o jakiś example z tym scanf

    http://www.cplusplus.com/reference/cstdio/scanf/
    Najpierw określ co chcesz zrobić, bo na razie pokazujesz piękne rozbijanie stringów na strukturę drzewa, tylko czy celem jest fantazyjna topologia czy może raczej przekształcenie ciągów znaków oznaczających liczby na faktyczne liczby?

    4\/3!!
  • #13
    toch88
    Level 11  
    po tym wszystkim (to działa mi na komputrze) wygląda to tak że ta struktura posada jeszcze jedna strukutre ;] związaną z funkcjami, które są rejestrowane do każdego wykrycia ciągu znaków np

    register_func(tprs, motor, "Silnik");

    rejestruje funkcje motor(TPARSER *tprs) o nazwie Silnik
    czyli jeżeli już wszystko jest ładnie pocięte, to przy porównywaniu każdego stringu do nazw funkcji zarejestrowanych w strukturze, wywoła odpowiednią funkcję z paramterami tego dziecka z którego znalazło Stringa :)

    tutaj dałem prosty przykład ale może być też tak ze bd funkcje LOOP która powtarza sekwencje oraz DH (notacja Denavita-Hartenberga) wiec chciałem mieć to jakoś poszatkowane.
    Zeby tego nie pisać na ifach i nie wiadomo czym.

    Dodano po 1 [minuty]:

    to wszystko powinno być przetłumaczone i zapisane w notacji zrozumianej przez sterwonik robota wysłane po RS 232 w postaci FF xx yy gdzie xx to nr silnika yy kat obortu

    Dodano po 3 [minuty]:

    czyli na chłopski rozum

    Silnik 2,34;Loop 5*Silnik 3,43;Silnika 5,64;

    powinien dać na rs 232

    FF0212 FF031B FF0520 FF031B FF0520 FF031B FF0520 FF031B FF0520 FF031B FF0520 mam nadziej ze sie nie pomyliłem w liczeniu
  • #16
    User removed account
    User removed account  
  • #17
    toch88
    Level 11  
    No własnie te nieszczęsne stringi ;) dobra poradziłem sobie :) dziękuję wszystkim za pomoc :)