Hi,
ich habe zwei Fragen zur AVR-GCC Speicherverwaltung (bezieht sich auf
die Version im AtmelStudio 6).
Beispielcode:
1 | static const __flash char t2[] = "Hallo Welt2";
|
2 |
|
3 | int main(void)
|
4 | {
|
5 | char *t1 = "Hallo Welt";
|
6 | }
|
7 |
|
8 | void anyStringFunction(const char* str);
|
1) Die Variable t2 wird im Programmspeicher angelegt, also dort, wo
auch er "normale" Code liegt. t1 wird im RAM angelegt. Nun ist der RAM
aber ein flüchtiger Speicher, kann also Inhalte nicht ohne
Versorgungsspannung vorhalten. Außerdem können die Inhalte im RAM
modifiziert werden (solange sie nicht als konstant deklariert sind). Bei
einem Neustart soll jedoch wieder der Ursprungswert verwendet werden.
Theoretisch muss also der Inhalt bei jedem Programmstart erneut in den
RAM kopiert werden. Und damit das möglich ist, muss der Inhalt auch
irgendwo persistent abgelegt werden, was nur ebenfalls im
Programmspeicher (Flash) oder im EEPROM möglich ist.
Werden die Inhalte wie von mir vermutet beim Start kopiert? Belegen
somit alle RAM Variablen auch zusätzlich Platz im Flashspeicher?
2) Soweit ich es verstehe arbeitet der Compiler bei der Verwendung des
__flash Attributs automatisch die entsprechenden Zugriffe ein, die
auch in der pgmspace.h definiert sind. Dies kann er aber doch nur,
solange er auch weiß, um was es sich handelt.
Habe ich nun eine Funktion wie anyStringFunction(char*), kann diese
Funktion doch nicht "wissen", ob der Parameter ein Zeiger auf eine RAM-
oder eine Programmspeicheradresse ist, oder? Was passiert in diesem
Fall? Ist es möglich eine Funktion zu schreiben, die mit t1 und t2
arbeiten könnte?
Danke im Voraus!
---
Threadtitel bereinigt.
-rufus