structure in flash speichern

Gast #4794186
Lesenswert?
• ▲
▼
Hallo zusammen,
ich versuche folgendes Struct im Flash abzuspeichern.
Das funktioniert soweit auch, dass Werte im Flash speicherbereich liegt. 
Wenn ich aber auf Werte[0].x zugreife ist dort nicht die 157 
gespeichert.

Kann mir bitte jemand weiterhelfen?
1
typedef struct {
2
  const float x;
3
  const float y;
4
} ADC_struct;
5

6
static const __flash ADC_struct Werte[7] = {
7
    { .x=  157  ,  .y=  150  },
8
    { .x=  172  ,  .y=  145  },
9
    { .x=  188  ,  .y=  140  },
10
    { .x=  206  ,  .y=  135  },
11
    { .x=  225  ,  .y=  130  },
12
    { .x=  246  ,  .y=  125  },
13
    { .x=  269  ,  .y=  120  },
14
  };
Gast #4794216
Lesenswert?
• ▲
▼
David schrieb:
> Kann mir bitte jemand weiterhelfen?

(Wenn es sich um AVR Code handelt:)
In <pgmspace.h> sind die Zugriffsfunktionen definiert die
du brauchst um auf Flash-"Variablen" zuzugreifen:

1
#define pgm_read_byte(address_short)    pgm_read_byte_near(address_short)
2
#define pgm_read_word(address_short)    pgm_read_word_near(address_short)
3
#define pgm_read_dword(address_short)   pgm_read_dword_near(address_short)
4
#define pgm_read_float(address_short)   pgm_read_float_near(address_short)
5

6
#define pgm_read_byte_near(address_short) __LPM((uint16_t)(address_short))
7
#define pgm_read_word_near(address_short) __LPM_word((uint16_t)(address_short))
8
#define pgm_read_dword_near(address_short) \
9
    __LPM_dword((uint16_t)(address_short))
10
#define pgm_read_float_near(address_short) \
11
    __LPM_float((uint16_t)(address_short))
Persönliche Seite #4794300
Lesenswert?
• ▲
▼
Glaskugel sagt: avr-gcc >= 4.7

Arduinoquäler schrieb:
> (Wenn es sich um AVR Code handelt:)
> In <pgmspace.h> sind die Zugriffsfunktionen definiert die
> du brauchst um auf Flash-"Variablen" zuzugreifen:

Unnötiges Trallalla; das Zeug wird mit __flash nicht benötigt.

David schrieb:
> dort nicht die 157 gespeichert.

Sollte aber :-)

Der erzeugte Assembler-Code sieht so aus:
1
  .section  .progmem.data,"a",@progbits
2
  .type  Werte, @object
3
  .size  Werte, 56
4
Werte:
5
  .byte  0
6
  .byte  0
7
  .byte  29
8
  .byte  67
9
...

Der Exponent ist also 2*67-127 = 7, und die Mantisse 0b1.0011101 was 
1.2265625 ist.  1.2265625 * 2^7 ist 157, wie erwünscht.

Vermutlich stimmt was mit deiner Ausgeberoutine nicht.

> Kann mir bitte jemand weiterhelfen?

Ohne mehr Info, nein.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren