Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

STM32 (Cortex M3) - Dynamiczna alokacja pamięci

toch88 13 Maj 2013 20:26 2514 16
  • #1 13 Maj 2013 20:26
    toch88
    Poziom 10  

    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:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    W pętli głównej obsługa tego wygląda tak:
    MAIN
    Kod: c
    Zaloguj się, aby zobaczyć kod


    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
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Tworząca dzieci

    Kod: c
    Zaloguj się, aby zobaczyć kod



    Teraz pytanie w jaki sposób zwolnić tą pamięć przed przybyciem paczki do parsowania? Mam napisane coś takiego ale niestety HardFault_Handler
    Kod: c
    Zaloguj się, aby zobaczyć kod


    tak wygląda deklaracja structury
    Kod: c
    Zaloguj się, aby zobaczyć kod

    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.

    0 16
  • #2 13 Maj 2013 21:08
    stanleysts
    Poziom 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);

    0
  • #3 13 Maj 2013 21:21
    toch88
    Poziom 10  

    Tak to prawda dzięki :) już działa lepiej aczkolwiek widzę że dalej przy którejś pętli wiesza się przy tworzeniu dziecka

    Kod: c
    Zaloguj się, aby zobaczyć kod


    jakby mu brakowało pamięci albo wchodził na zapisany wskaźnik ;/ hmm w jaki sposób móglbym to sprawdzić w keilu ?

    0
  • #4 13 Maj 2013 21:23
    BlueDraco
    Specjalista - Mikrokontrolery

    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?

    0
  • #5 13 Maj 2013 21:27
    toch88
    Poziom 10  

    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.

    0
  • #6 13 Maj 2013 21:27
    stanleysts
    Poziom 27  

    Wogóle skąd masz implementacje tych funkcji dynamicznej alokacji pamięci?

    0
  • Pomocny post
    #8 13 Maj 2013 21:44
    stanleysts
    Poziom 27  

    Chodzi mi jak na stm zaimplementowałeś/skad wziales funkcje malloc/free.

    0
  • #9 13 Maj 2013 22:01
    toch88
    Poziom 10  

    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

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #10 13 Maj 2013 22:11
    Freddie Chopin
    Specjalista - Mikrokontrolery

    toch88 napisał:
    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!!

    0
  • #11 13 Maj 2013 22:19
    toch88
    Poziom 10  

    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 .

    0
  • #12 13 Maj 2013 22:23
    Freddie Chopin
    Specjalista - Mikrokontrolery

    toch88 napisał:
    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!!

    0
  • #13 13 Maj 2013 22:36
    toch88
    Poziom 10  

    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

    0
  • Pomocny post
    #15 14 Maj 2013 10:48
    Freddie Chopin
    Specjalista - Mikrokontrolery

    Tylko co do rzeczy ma semihosting?

    P.S. Oczywiście powinieneś używać sscanf(), bo chcesz przerabiać gotowy string, a nie czytać ze strumienia FILE. No chyba że chcesz [;

    4\/3!!

    0
  • #16 14 Maj 2013 12:19
    94075
    Użytkownik usunął konto  
  • #17 14 Maj 2013 15:48
    toch88
    Poziom 10  

    No własnie te nieszczęsne stringi ;) dobra poradziłem sobie :) dziękuję wszystkim za pomoc :)

    0