Forum: Mikrocontroller und Digitale Elektronik structure in flash speichern


von David (Gast)


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
  };

von THOR (Gast)


Lesenswert?

Dann zeig doch mal den Code dazu.

von Arduinoquäler (Gast)


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))

von Johann L. (gjlayde) Benutzerseite


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.