Hallo zusammen,
für den CodeCheck in meinem Programm bilde ich mit Hilfe einer
CRC-Tabelle einen Check über den Flash-Speicher.
Die Tabelle liegt ebenfals mit PROGMEM im Programmspeicher.
Jetzt habe ich das gleiche beim Bootloader für einen ATMEGA1284P
gemacht.
Hier liegt die Tabelle jetzt natürlich im Bootloader-Bereich. Für den
Zugriff benutze ich deshalb pgm_read_word_far.
Funktionieren tut es wunderbar, allerdings bekomme ich eine Warnung vom
Compiler, die ich nicht verstehe, und auch durch casten nicht weg
bekomme.
Die CRC-Prüfung im Code sieht so aus:
Und der Compiler meckert:
warning: cast from pointer to integer of different size
Die Warnung bezieht sich auf jeden Fall auf das pgm_read_word_far, denn
im ursprünglichen Code, in dem die Tabelle am Anfang des Flashs lag, war
es nur pgm_read_word und da kam keine Warnung.
Hat jemand ne Ahnung, wo das Problem liegt was ich dagegen tun kann?
Viele Grüße
Markus
Schön, dass du von keiner der beteiligten Variablen die Deklaration mit
angegeben hast. Raten macht ja auch viel mehr Spaß. Und auf welche der
Zeilen, die ein pgm_read_byte_far enthalten, sich die Warnung bezieht,
hast du auch nur indirekt mitgeteilt. Das zeigt, dass du mitdenkst, denn
mehr Raten bedeutet natürlich mehr Spaß.
Ok, fangen wir an mit dem Raten:
Die Warnung bezieht sich auf "pgm_read_word_far(Crctab + (uiCRC >> 8))"
und Crctab ist ein PROGMEM-Array. In dem Fall liegt das eigentliche
Rätsel hier:
> Funktionieren tut es wunderbar
Sicher, dass du den Bootloader richtig platziert hast, er also
tatsächlich oberhalb von 64k liegt?
Die Meldung bezieht sich auf die Zeile in der for-Schleife, also auf das
pgm_read_word_far und nicht pgm_read_word_byte.
Der Bootloader und auch die CRC-Tabelle liegen im Bereich ab 0x1F000,
das ist sicher, der Bootloader funktioniert und ich habe auch das
hex-file kontrolliert.
Markus schrieb:> Der Bootloader und auch die CRC-Tabelle liegen im Bereich ab 0x1F000,> das ist sicher, der Bootloader funktioniert
Nun, ich hätte jetzt auf den ersten Blick gesagt, dass das nicht
funktionieren kann, weil das Argument von pgm_read_word_far nur eine 16
Bit große Adresse ist. Tut es aber doch, aber eher zufällig, denn die
Adresse wird vorzeichenbehaftet auf 32 Bit erweitert, und RAMPZ besteht
ja nur aus einen Bit, so dass die ganzen anderen Einsen in den oberen 2
Byte nicht weiter stören.
Ich würde es eher so schreiben:
Hallo Stefan,
ja, es funktioniert so tatsächlich ohne Warnung.
Das Problem dabei ist nur, dass ich ja dann festlege, wo sich der
Bootloader befinden muss, bei kleineren oder größeren Controllern müsste
ich da wieder aufpassen, dass ich die Offset-Adresse ändere.
Was ist denn, wenn ich irgendetwas im normalen Programm als PROGMEM
speichere und da eine 64k-Grenze überschreite?
Gibts ne Möglichkeit, den Crctab direkt irgendwie als 32bit Pointer zu
bekommen, denn bei 16bit bleibt das Problem ja immer irgendwie.
Oder wie könnte man das ganze vielleicht noch anders lösen?
Vielen Dank für deine Hilfe.
Markus schrieb:> Gibts ne Möglichkeit, den Crctab direkt irgendwie als 32bit Pointer zu> bekommen, denn bei 16bit bleibt das Problem ja immer irgendwie.
In reinem C nicht, höchstens über Inline-Assembler.
Markus schrieb:> Oder wie könnte man das ganze vielleicht noch anders lösen?
Ich würde die CRC-Bildung ohne LUT implementieren. Oder inwieweit ist
das im Bootloader zeitkritisch?