Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[Programowanie, C] - tablica globalna,alokacja pamięci,STM32

gwiezdnik 10 Dec 2010 22:45 2610 2
  • #1
    gwiezdnik
    Level 10  
    Hej...

    Mam pytanie z programowania, C, już głupieję...

    Chcę zrobić globalną tablicę z danymi bajtowymi. Każdy wiersz ma kilka pól oraz tablicę bajtową, różnej długości, od 4 bajtow do np. 100kB (teoretycznie). Musi być to zatem wskaźnik na dane, zeby kazda tablica bajtowa miala inna dlugosc.

    Próbowałem zrobić tablicę wskaźników i przydzielać pamięć malloc-kiem (sądząc że to odpowiednik new linuxowego). Niestety, procek wywalał się z faultem przy 30 zaalokowanych zmiennych 4 bajtowych. uC ma 20kB SRAM-u, i tenze SRAM byl niemlaze caly pusty, no moze ze 2kB zajęte. Czyli zaalokowalem jakies 30*4 bajty, do tego obsługa, pewnie z 240 bajtów wyszło? Nie wiem dokładnie, nie pamiętam :/

    W jaki sposób alokować pamięć dla takich danych? Powinno się rzeczywiście robić to mallockiem? Jeśli tak, to przygotuję testowy program i przedstawię wyniki jak procek pada ze szczegółami. Ale może robię jakiś błąd?

    Generalnie co chcę osiągnąć:

    1) Jest tablica globalna o której wspomniałem

    2) jest sobie inna funkcja, która lokalnie przygotowuje dane, wywoluje funkcje "AddToArray" ze wskaznikiem na te dane i dane zostana permanetnie dopisane do tablicy. Funkcja konczy swoje dzialanie i zwalnia swoje lokalne zmienne.

    3) Usuniecie danych z tablicy i zwolnienie pamieci dla danych tablocy powinno sie odbyc w kompletnie innym momencie przez inna funkcje.

    Przepraszam za dlugi post, mam nadzieje ze w miare jasno wyklarowalem... Sadzilem ze to jakas banalna sprawa, pomijajc narzut dla malych danych - sadzilem ze malloc rozwiaze moj problem, a on takiego byka mi strzelal :(

    Pzdr,
    Damian
  • Helpful post
    #2
    nsvinc
    Level 35  
    Coś naplątałeś...

    Aby uzywać malloca bez dziwnych errorów, musisz zadeklarować odpowiednią ilość miejsca na stertę. Co z tego, ze twoje zmienne zajmują niewiele ramu, skoro najpewniej ustawiles sobie parę kB sterty, i gdy przekroczysz te pare kB, program ci sie natychmiast wykrzaczy, bo oczywiście najpewniej nigdy nie sprawdzasz, czy malloc przypadkiem nie zwróci zera...

    Czym jest "wiersz"? Z tego co napisałeś, potrzebujesz rekordu typu:

    
    typedef struct _tRekord
    {
    unsigned char naglowek1;
    unsigned int costam1,costam2,costam3;
    unsigned char *tablica;
    } tRekord;
    


    Z tego co napisałeś, oprócz dynamicznej ilości rekordów, do każdego rekordu należy dodatkowo tablica bajtow (jw.) o zmiennej wielkości.

    Najpierw musisz mieć jakis uchwyt do tablicy samych rekordów...

    
    tRekord **rekordy;
    unsigned int ile;
    


    Pracujesz na rekordach, w ktorych dodatkowo masz dynamiczną tablicę bajtów, więc:

    
    tRekord *nowyRekord(unsigned int init1,unsigned int init2,unsigned int iletablica)
    {
    tRekord *rek=malloc(sizeof(tRekord)); //wlasnie zrobilismy REKORD
    if (rek)
    {
    unsigned char *tabb=malloc(sizeof(unsigned char)*iletablica);
    if (tabb)
    {
    //w tym miejscu masz na gotowo pamięc pod rekord I TABLICE BAJTOW
    //wiec mozna przeprowadzać już inity struktury
    rek->tablica=tabb; //wpisz w rekord nowy wskaznik
    return(rek); //i wypluj wskaznik
    };
    
    };
    }
    


    Oczywiscie musisz zainicjalizować sobie główne drzewko, i umieć nim zarządzać....

    
    unsigned int dodajRekord(tRekord *rek)
    {
    tRekord **rekkordy=realloc(rekordy,sizeof(tRekord*)*(ile+1)); //prubuj zaalokowac wienksza tablice...
    if (rekkordy) //udalo sie
    {
    rekordy=rekkordy; //przepisz nowy wskaznik
    rekordy[ile]=rek; //wlasciwie dolurz nowy rekord do tablicy
    ile++;
    return(ile);
    } else return(0xdeadbeef); //deadbeef == nierzywaCielencina :]
    }
    


    ...Mam nadzieje ze troche pomoglem...
  • #3
    gwiezdnik
    Level 10  
    nsvinc wrote:

    Aby uzywać malloca bez dziwnych errorów, musisz zadeklarować odpowiednią ilość miejsca na stertę.


    I to jest baaardzo przydatna informacja :) Do tej pory używałem startupa z CMSIS-a, a tam rzeczywiście: heap = 0x200. Już wcześniej miałem napisany cały mechanizm do posługiwania się wskaźnikami, ale nie mogłem zadeklarować więcej niż ileś, no i teraz pewnie problem rozwiązany. DZIĘKI! :) W sumie mogłem się domyślić... do tej pory pisałem w C na pecetach i nie miałem problemu z wielkością pamięci, stosów, stert i innych... Raz jeszcze dzięki.

    nsvinc wrote:

    bo oczywiście najpewniej nigdy nie sprawdzasz, czy malloc przypadkiem nie zwróci zera...


    Sprawdzam, sprawdzam, a konkretniej czy nie zwraca nulla :)

    nsvinc wrote:
    ...Mam nadzieje ze troche pomoglem...


    Bardzo :)

    Dzięki.

    Damian