IDE 1.5.7 error: 'prog_uint8_t' was not declared in this scope

Kennt den schon jemand? Ich wollte mein Projekt schnell mal eben mit der 1.5.7 ausprobieren...

Ich nehme an hier geht es um PROGMEM Daten, oder?

1.5.7. hat endlich, endlich mal die AVR toolchain aktualisiert. Und die speziellen PROGMEM Datentypen sind in der avr libc jetzt deprecated.

Einfach so machen:

const char array[10] PROGMEM = { ... };

const correctness wird jetzt auch erzwungen. Das ist vor allem bei String Arrays relevant wo in den Tutorials und einigen Libs Pointer auf const Daten stehen. Jetzt wird aber ein const Pointer auf const Daten gefordert.

Danke. War auf der falschen Spur…
Naja, mein code sieht da eher so aus:

static word CalculateChecksum (word addr, word size) {
  word crc = ~0;
  prog_uint8_t* p = (prog_uint8_t*) addr;
  for (word i = 0; i < size; ++i) {
    crc = _crc16_update(crc, pgm_read_byte(p++));
  }
  return crc;
}

d.h. ich durchlaufe ein paar Bytes vom Flash (Bootloader) um die Bootloaderversion zu bestimmen.
P ist ein Zeiger auf den oberen Flashbereich 0x7E00
Hat also weniger mit Constanten denn mit Flashzugriffen zu tun. Hab’s jetzt geändert in

 static word CalculateChecksum (word addr, word size) {
  word crc = ~0;
  word endCrc = addr + size;
  for (word i = addr; i < endCrc; ++i) {
    crc = _crc16_update(crc, pgm_read_byte((void *)i));
  }
  return crc;
}

Scheint jetzt zu compilieren. Muss ich aber noch testen…

Da hätte ich auch erst mal versucht das durch einen const Pointer auf char* zu ersetzen :slight_smile:
Aber Hauptsache es geht

Flash kann sich ja nicht ändern. Das ist ein Grund weshalb da jetzt const erzwungen wird. Das vorher auch schon empfohlen, aber ging bisher ohne.

Siehe hier, wieso man diese typedef Datentypen nicht mehr nehmen soll:
http://www.nongnu.org/avr-libc/user-manual/group__avr__pgmspace.html#ga75acaba9e781937468d0911423bc0c35

This typedef is now deprecated because the usage of the progmem attribute on a type is not supported in GCC. However, the use of the progmem attribute on a variable declaration is supported, and this is now the recommended usage.

The typedef is only visible if the macro PROG_TYPES_COMPAT has been defined before including <avr/pgmspace.h> (either by a #define directive, or by a -D compiler option.)

Wo wir gerade beim Thema sind. Weißt du wie man Daten in den far Bereich >64k platziert?

Ich habe das hier gefunden:

#define FLASH_STRING  __attribute__ ((section (".bootstring")))

Das ist aber auch speziell für den Boot Sektor. Ich habe keine Ahnung welche Sektion für den höheren Flash Bereich ist.

Ich weiß dass man dann mit far pointern arbeiten muss. Für den Teil habe ich Code gefunden. Ich habe aber auch was gelesen, dass man das Linker Script ändern müsste. Vielleicht sollte ich es lieber lassen, da es eigentlich noch nicht nötig ist…

NACHTRAG:
Ah, jurs scheint wieder mal die Lösung gefunden zu haben:

.fini1 und aufwärts sind wohl im far Bereich. Den Namen hatte ich schon gehört, aber es stand nirgends welcher Bereich das genau ist.