Gast
#100735
Eine Frage zu Pointer auf Ram bzw. PROGMEM:
Kann man über die Adresse des Pointers unterscheiden, ob
Daten im RAM oder im PROGMEM liegen? Wie ordnet der gcc
Linker die Daten im Flash an?
Könnte man den Linker so konfigurieren, dass Daten, die im Flash
liegen immer oberhalb der größten RAM Adresse liegen?
Beispiel:
ATmega16 hat 1kByte RAM und 16kByte Flash. Wenn der Linker
die PROGMEN Daten erst oberhalb der Adresse 1024 ablegt, könnte man
zwischen Daten aus dem RAM und Daten aus dem Flash mittels
Pointeradresse unterscheiden.
// .... Beispielcode....
char Text1[] = "Text im RAM";
const char Text2[] PROGMEM = "Text im Flash";
// ...
#define RAMEND 0x45F
void SendText(char *ptr)
{
if (ptr > RAMEND)
uart_puts_p(ptr); // Daten liegen im Flash
else
uart_puts(ptr); // Daten liegen im RAM
return;
}
int main(void)
{
SendText(Text1);
SendText(Text2);
}
Was haltet ihr von dieser Idee? Klar, die Software wird
Microsekunden langsamer aber das tut meistens sowieso
nicht weh....
Klaus