Forum: Compiler & IDEs PROGMEM -- liest ab bestimmten Array nicht mehr aus


von Jens (Gast)


Lesenswert?

Habe mehrere Dateien mit mit
1
uint8_t    Tab0[]   PROGMEM = Daten0,
2
 Tab1[]   PROGMEM = Daten1,
3
bis ...
4
Tab12[]   PROGMEM = Daten12;

in den Programmspeicher geladen

Dabei ist Datenx relativ groß, und so definiert
1
#define Daten0 {2,3,4,1, usw...}

nun gibt es 12 solcher Dateien und ab der 7. wird dann nicht mehr 
ausgelesen bzw. wieder vorn angefangen.

ich denke ja, dass der Pointer nicht weiterzählt, weil er zu klein ist.

benutze folgende Auslesezeile:
1
aTemp = pgm_read_byte(&Tab0[CounterBytes]);

dabei ist der CounterBytes 16Bit groß, die ersten 6 Dateien werden gut 
ausgelesen.

Was kann man tun?

: Verschoben durch Moderator
von Rene Z. (rzimmermann)


Lesenswert?

Hallo,

wie gross ist das Array den? Welcher Controller wird verwendet?
1
#define  pgm_read_byte_far(address_long)   __ELPM((uint32_t)(address_long)) 
2
#define  pgm_read_word_far(address_long)   __ELPM_word((uint32_t)(address_long)) 
3
#define  pgm_read_dword_far(address_long)   __ELPM_dword((uint32_t)(address_long)) 
4
#define  pgm_read_float_far(address_long)   __ELPM_float((uint32_t)(address_long))

http://www.nongnu.org/avr-libc/user-manual/group__avr__pgmspace.html

Gruß

von Jens (Gast)


Lesenswert?

Ich stell den Beitrag mal unter uC ein.

ich verwende ein Board mit dem ATMega 1280.


(Mod.: der Beitrag passt in dieses Unterforum, Doppelpost unbegründet)

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Wieviel Daten sollen dann nach PROGMEM gelegt werden? Mehr als 64k?

von Jens (Gast)


Lesenswert?

ja,

es ist ja auch so, dass mitten in der 7. Datei dann wieder die erste 
ausgelesen wird.
Also so, als würde der Adressspeicher überlaufen. Ich weiß nur nicht ob 
es beim Einspeichern, also bei Progmem oder beim Auslesen passiert.
Ich denke, der Adressspointer müsste größer sein.

Es sind sehr viele 8Byte Konstanten - Messreihen.

von g457 (Gast)


Lesenswert?

> Also so, als würde der Adressspeicher überlaufen.

Nicht ganz, die Adresse (bzw. das Ergebnis der Adressberechnung) läuft 
über.

> Ich denke, der Adressspointer müsste größer sein.

Ja, und zwar sizeof(uint32_t), nicht sizeof(void*) wie aus der Signatur 
von pgm_read_byte_far() (siehe Doppelpost) eindeutig hervorgeht -> 
Adresse selber ausrechnen.

Alternativ wäre noch zu klären, ob der Compiler mit __flash richtig(tm) 
rechnen würde.

von Falk B. (falk)


Lesenswert?

@ Jens (Gast)

>Es sind sehr viele 8Byte Konstanten - Messreihen.

Jaja, und mein Bruder hat ein gaaaanz grooooßes Auto.

Mensch, nenn man ein paar ZAHLEN!!!

Siehe

http://www.mikrocontroller.net/articles/Netiquette#Klare_Beschreibung_des_Problems

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

g457 schrieb:

> Alternativ wäre noch zu klären, ob der Compiler mit __flash richtig(tm)
> rechnen würde.

Ja, tut er: Er rechnet genauso wie in der Dokumentation beschrieben :-)

von Jens (Gast)


Lesenswert?

Danke erst mal, also es ist der ATM1280. Der ist zu 97% voll mit den 
über PROGMEM eingelesenen Daten, das hat also funktioniert.

Die Größe schätze ich jetzt mal, da es Bytes von Dateien sind, die ich 
vorher mit Delphi in eine h Datei umgewandelt habe.

Hier der Code-Auszug:
1
   uint8_t  Tab0[]   PROGMEM = TabDaten0,
2
  Tab1[]   PROGMEM = TabDaten1,
3
  ...
4
  Tab11[]   PROGMEM = TabDaten11;

dann die TabDaten – sie sehen etwa so aus.
Header File
1
 #define TabDaten0 {156,4,57,32,... 45,68\
2
      23,34,113, ... 78,54 \
3
      24,200}
jetzt die Größen

ein File ist etwa 7KB groß
alle 12 Files sind ca. 110KB groß

ausgelesen habe ich bisher mit
1
 x = pgm_read_byte(&TabDaten0[i]);
was bis zur 7. Tabelle wunderbar geht.

von Falk B. (falk)


Lesenswert?

Beitrag "Re: PROGMEM -- liest ab bestimmten Array nicht mehr aus"

Deine Daten ab der 7. Tabelle liegen oberhalb von 64kB, dort muss man 
per _far Zugriffen arbeiten.

von Jens (Gast)


Lesenswert?

Also mit

pgm_read_byte_far(&TabDaten10[i])

Das habe ich probiert, geht aber nicht, folgende Warnung erscheint;

warning: cast from pointer to integer of different size

von Falk B. (falk)


Lesenswert?

Was wohl daran liegt, dass deine Variablentypen nicht stimmen. Ich habe 
auch noch nie mit den _far Funktionen gearbeitet. Vielleicht so.
1
uint_farptr_t my_far_pt = &TabDaten10;
2
pgm_read_byte_far(&my_far_pt[i])

von hal9000 (Gast)


Lesenswert?

Jens schrieb:
> aTemp = pgm_read_byte(&Tab0[CounterBytes]);

wusel wusel. Mein Tipp für wenig Geld gibt es professionelle Compiler
die diesen Mist nicht brauchen.

von Stefan E. (sternst)


Lesenswert?

Falk Brunner schrieb:
> Vielleicht so.

Nein. Das grundlegende Problem hier ist, dass ein Pointer halt nur 
16-Bit hat. Der "direkte" Weg geht also in keinem Fall.

Wieso gibt es hierzu eigentlich 2 Threads?
Beitrag "pgm_read_byte_far"

von Jens (Gast)


Lesenswert?

ja danke erst mal,

habe gerade hier gefunden, dass der AVR-GCC tatsächlich Zeiger nur bis 
16bit akzeptiert. Na prima.

von g457 (Gast)


Lesenswert?

> habe gerade hier gefunden, dass der AVR-GCC tatsächlich Zeiger nur bis
> 16bit akzeptiert. Na prima.

Schön dass mein Hinweis und meine Lösung von gestern Abend 2335 doch 
noch gelesen wurden. Hatte schon befürchtet, dass die durchgeflutscht 
seien.

Und wie schon gesagt: selber berechnen, das ist nur wirklich kein 
Beinbruch.

Nix für ungut

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Nimm __memx, dann sind Zeiger 24 Bit groß.

von Falk B. (falk)


Lesenswert?

@ Johann L. (gjlayde) Benutzerseite

>Nimm __memx, dann sind Zeiger 24 Bit groß.

Kann man das auch mal als gescheites Beispiel darstellen, damit es auch 
normale Leute ohne ultimatives Insiderwissen verstehen?

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Welcher Teil der GCG-Doku ist denn unklar?

http://gcc.gnu.org/onlinedocs/gcc/Named-Address-Spaces.html

Oder gehört die Doku jetzt schon zum Insiderwissen ?

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.