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.

[avr mega8] adresowanie duzych tablic

bua 14 Maj 2008 09:37 1280 4
  • #1 14 Maj 2008 09:37
    bua
    Poziom 12  

    Witam.

    Mamy duza tablice:
    powiedzmy :

    Code:
    char tab[1000];
    
    //i tablice mapujaca :

    char map[256];
    int offs[256];
    char widt[256];


    sa wypełnione jakimis bajtami.

    jest sobie struktura Font ktora pokazuje na te tablice:
    Code:
    struct Font{
    
        char* tablica;
        int * offsets;
        char* maps;
        char* w;
    };


    mamy teraz funkcję:
    do ktorej przekazujemy parametry:
    Code:
    const char napis[]="mama";
    
    struct Font arial = {tab,offs,map,widt};

    doSmt(napis,&arial);
    version 1:
    Code:
    void doSmt(const char* str,struct Font *font){
    
        int napisOffsets[10]={0}; // mam wrazenie ze taka
                                        //inicjalizacja wskaznika nie przynosi                 
                                                  // zadnego efektu tzn. nie wypelnia
                                                  //tablicy zerami...   
        char w[10]={0};
        int posmap = 0;

    for(int i = 0;i<strlen(str);i++){
        posmap = font->maps[str[i]];
        napisOffsets[i] = font->offsets[posmap];
        w[i] = font->w[posmap]
    }
        print(for(width)for(height)x=font->tablica[i] ;putPixel(x,w)  );
    };
    version 2:
    Code:
    void doSmt(const char* str,struct Font *font){
    
        napisOffsets[] = {612,140,512,702};
        w[]={7,8,7,8}
                                                //takie cos powinno byc po
                                                //wykonaniu petli w poprzedniej funkcji

       print(for(width)for(height)x=font->tablica[napisOffsets[i] ] ;putPixel(x,w)  );
    };

    print to oczywiscie pseudo kod.
    pisalem teraz wszystko z palca wiec drobne bledy mogly sie wkrasc, ale mowie o skompilowanej dzialajacej wersji..

    Pierwsza wersja kodu nie dziala wogole...
    w tablicach
    Code:
    napisOffsets[]
    
    i
    w[]

    po wykonaniu petli sa same smieci..
    font->tablica[napisOffsets[i] ] widzi same smieci...co nie dziwi..bo w napisOffsets[] sa dziwne rzeczy//i te rzeczy zaleza nawet od optymalizaji



    Druga z podanymi z palca mapowaniami dziala pseudo dobrze, pokazuje poprawnie na wybrane znaki z calej tablicy.
    po pierwsze dzieja sie jakies dziwne rzeczy ze wskaznikiem na Font, mam wrazenie ze cos sie tam wali...
    czy to wina avr-gcc ? probowalem roznych optymalizacji i na kazdej dzieja sie inne "niewyjasnione" zjawiska...

    wszystkie wartosci podgladam sobie wysylajac je na UARTA na PC i widze ze strasznie dziwne rzeczy sa przesylane...

    nie wiem moze mam za stare avr-gcc, 3.4.1 bodajze.

    prosze o komentarze.
    pzdr

    0 4
  • #2 14 Maj 2008 10:22
    szelus
    Specjalista - Mikrokontrolery

    Masz mega8? A wiesz, ile ona ma pamięci? Jakim cudem chcesz tam zmieścić tak duże tablice?
    Chyba, że we flaszu, ale wtedy musisz je tam zadeklarować i odwoływać się jawnie za pomocą odpowiednich funkcji.

    0
  • #3 14 Maj 2008 12:07
    Zaquadnik
    Poziom 27  

    Podpowiedź:
    Definicja tablicy we fleszu:

    Code:

    char WCholereDuzaTablica[1000] PROGMEM = {/*tutaj wartości*/};


    I odczyt wartości:
    Code:

    Zmienna = pgmReadByte(&WCholereDuzaTablica[indeks]);


    Mega8 ma 1 kB SRAMu, nie wciśniesz tam tej tablicy, bo jeszcze stos i inne zmienne gdzieś muszą się zmieścić.

    0
  • #4 14 Maj 2008 12:29
    bua
    Poziom 12  

    okej dzieki za odpowiedzi,

    te duze tablice byly zdeklarowane z odpowiednimi wartosciami w pliku tablica1.c,
    tablica2.c itd..

    i myslalem ze po kompilacji trafiaja do flasha ...

    wiec jest punkt zaczepienia dzieki :)

    pzdr

    0
  • #5 15 Maj 2008 08:35
    bua
    Poziom 12  

    Ze tak powiem...:

    jak ręką odjął, problemy znikły..

    dzieki

    pzdr

    mozna zamknac

    0