logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[avr mega8] pgm_read_"float" ?

bua 30 Gru 2008 01:27 1116 3
REKLAMA
  • #1 5922085
    bua
    Poziom 12  
    Witam.
    Mam tablice float'ow (okolo 25 elementow)
    przyklad:

    const float PROGMEM tab[] = {0,
        2.3333,
        -9,3344,
        -3,013E-02,
        ....
        };


    teraz chcialbym wyciagac te elementy z obszaru programu
    czyms takim :

    pgm_read_dword_near(&tab[0])


    tak kombinuje ze moze unia to pociagnie:

    union float_ {
      float a;
      int b[2];
    } *wsk;
    
    wsk = tab;
    pgm_read_dword_near(&(wsk->b[0]));
    pgm_read_dword_near(&(wsk->b[1]));


    Narazie nie moge tego przetestowac,
    opinie i propozycje mile widziane.
  • REKLAMA
  • REKLAMA
  • #3 5927353
    arturt134
    Poziom 27  
    Moim zdaniem nie będzie działać dobrze.
    Używasz funkcji pgm_read_dword, która odczytuje 4 bajtową liczbę; float ma 4 bajty więc wystarczy jeden odczyt, a unia powinna wyglądać tak:
    union {
    float a;
    uint32_t b;
    } x;

    Wydaje mi się też, że masz atrybut PROGMEM w złym miejscu. Nie jestem tego pewien, więc sprawdź w instrukcji do GCC.

    Możesz też zrobić to prościej. Wystarczy, że użyjesz rzutowania.
    PROGMEM const float  tab[] = {0, 0.1, 0.2};
    float liczba_odczytana
    *((uint32_t*) &liczba_odczytana) = pgm_read_dword_near(&tab[0]);
  • #4 5927926
    bua
    Poziom 12  
    arturt134 napisał:
    Moim zdaniem nie będzie działać dobrze.
    Używasz funkcji pgm_read_dword, która odczytuje 4 bajtową liczbę; float ma 4 bajty więc wystarczy jeden odczyt, a unia powinna wyglądać tak:
    union {
    float a;
    uint32_t b;
    } x;

    Wydaje mi się też, że masz atrybut PROGMEM w złym miejscu. Nie jestem tego pewien, więc sprawdź w instrukcji do GCC.

    Możesz też zrobić to prościej. Wystarczy, że użyjesz rzutowania.
    PROGMEM const float  tab[] = {0, 0.1, 0.2};
    float liczba_odczytana
    *((uint32_t*) &liczba_odczytana) = pgm_read_dword_near(&tab[0]);


    W nowej wersji 11.2008 avr libc, jest juz funkcja
    pgm_read_float_near()

    Dziala, przetestowalem.
    PROGMEM mam na 100% w dobrym miejscu.
REKLAMA