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.

[avr-gcc] Dwuwymiarowa dynamiczna tablica

Pagodin 13 Mar 2008 14:02 3385 11
  • #1
    Pagodin
    Level 10  
    Witam !

    Mam następujący problem: nie wiem jak zadeklarować dwuwymiarową globalna tablicę tak aby można było się do niej odwoływać np w przerwaniu. Jednocześnie chciałbym móc zmieniać wielkość tablicy w funkcji main. Jak to zrobić? Z góry dziękuję za podpowiedź. Niżej przedstawiam mój mizerny kod.

    Code:

    #include <avr/io.h>
    #include <avr/interrupt.h>
    #define STALA 5000

    int n=0;
    int m=0;

    int charset[n][m];

    SIGNAL (SIG_OVERFLOW1) //obsluga przerwania
    {

    PORTA=charset[0][0];

    TCNT1 = 65535-STALA;

    }


    int main (void)
    {
    n=2;
    m=2;

    DDRA = 0xFF;

    TCCR1A = 0x00;
    TIMSK = _BV(TOIE1);
    TCCR1B = _BV(CS10);
    TCNT1 = 65535-STALA;

    sei();

    while(1)
    {

    }
    return 0;
    }
  • #2
    Fyszo
    Level 37  
    Zrób definicję szkieletu tablicy.
    Potem dynamicznie zaalokuj pamięć o odpowiedniej wielkości.
    Na koniec nałóż tą tablicę na wskaźnik do zajętego obszaru.
  • #3
    Pagodin
    Level 10  
    Coś takiego?

    Code:

    int *charset = (int *) malloc(20);


    A jak zrobić dwuwymiarową?
  • Helpful post
    #4
    KowalD
    Level 17  
    ale czy znajdziesz biblioteke z malloc dla avr?? jakos mi sie wydawalo zawsze, ze avr nie udostepniaja opcji dynamicznej alokacji pamieci...

    a sama alokacja, to bedzie np cos takiego...
    Code:
    int rows = 6, cols = 5;
    
    double **a;
    a = malloc (rows * sizeof (double *));
    if(!a) abort();
    for (i = 0; i < rows; i++)
    {
      a[i] = malloc (cols * sizeof (double));
      if(!a[i]) abort();
    }

    oczywiscie na int-y pozamieniaj... i jakos inaczej bedziesz musial zalatwic sprawe niepowodzenia alokacji :)...
  • #5
    Pagodin
    Level 10  
    Witam

    Biblioteka: avrlibc, plik nagłowkowy: stdlib.h udostepnia *malloc() i free(). Dzięki za przykład zaraz poćwiczę i ewentualnie dam znać w razie innych pytań.

    Pozdrawiam
  • #6
    KowalD
    Level 17  
    oooo... wlasnie :)... dobrze, ze napisales... nie zapomnij, ze pozniej ze zwolnieniem tego miejsca tez nie jest tak banalnie :)... bo trzeba najpierw pozwalniac wszystkie te wektory wiersza i dopiero ten od kolumn... cos takiego...
    Code:
    for (i = 0; i < rows; i++)
    
      free (a[i]);
    free (a);
  • #7
    elektryk
    Level 42  
    Wydaje mi się że to zabójstwo dla procesora, ale chętnie posłucham opisu projektu który wykorzystuje taką tablicę.
  • #8
    Fyszo
    Level 37  
    W jakim sensie zabójstwo? Że niby za mało ramu i łatwo przecholować?
  • #9
    KowalD
    Level 17  
    no mnie tez sie wydaje, ze to przesada stosowac alokacje dynamiczna w AVR... pewnie biblioteka sama sporo zajmie pamieci...
  • #10
    adamusx
    Level 27  
    Ja tez jestem takiego zdania. Stosowanie dynamicznej alokacji pamieci w AVRach ma sens chyba tylko w celach edukacyjnych.
  • #11
    fantom
    Level 31  
    W przypadku tak prostych procesorow dynamiczna alokacja pamieci moze sie opierac tylko na tzw. alokacji jednorazowej tzn. raz przedzielony obszar nie bedzie juz zwolniony (fizycznie).Ilosc struktur potrzebnych do prawdziwego zarzadzania pamiecia jest tak duza ze w tak prostych architekturach nie ma to najmniejszego sensu.
  • #12
    Fyszo
    Level 37  
    Można dynamicznie alokować bez biblioteki. Pisząc o dynamicznym alokowaniu chodziło, bardziej o takie rozwiązanie. W asemblerze łatwo to zrealizować , wystarczy pamiętać o obszarze na tablicę, i pilnować żeby nić nie nadpisać. Stosować zmienne 'koniec tablicy' itp.