Forum: Compiler & IDEs kleine char* frage.


von Simon (Gast)


Lesenswert?

In MPLABX  (XC16)

Das hier speichert einen String in den Speicher und gibt einen const 
char*
wieder.
Das heißt die funktion sieht dann so aus debug_putstr(char *z);

1
debug_putstr("bla"); // String mit \0 am ende


Wenn ich jetzt aber versuche genauso im Speicher einen String abzulegen. 
bekomme ich ständig pointer die irgendwohin zeigen aber nicht wohin sie 
sollen.
1
 const char *x = "bla";

Wie ist den Der richtige weg einen String zu Speichern wenn man das 
nicht als array tun möchte, und dieser String genauso wie im Beispiel 1 
mit einem '\0' abgeschlossen werden soll.

von Peter II (Gast)


Lesenswert?

1
 const char *x = "bla";

ist richtig, der Fehler wird wo anders sein.

von Simon (Gast)


Lesenswert?

Peter II schrieb:
> ist richtig, der Fehler wird wo anders sein.

Wird hier auch eine \0 angehangen?

von Peter II (Gast)


Lesenswert?

Simon schrieb:
> Wird hier auch eine \0 angehangen?

ja

von Simon (Gast)


Angehängte Dateien:

Lesenswert?

Es scheint wirklich zu funktionieren.
Danke dir.

Kann mir einer Sagen warum unten in der Variablenansicht PSV Steht und 
das Steinchen davor geld wird?

von Markus F. (mfro)


Lesenswert?

Simon schrieb:
> Kann mir einer Sagen warum unten in der Variablenansicht PSV Steht

"PSV" steht für "Program Space Visibility" und ist das Geheimnis, wie 
MicroChip ihre 8-Bit Prozessoren auf 16 Bits "hochgerüstet" hat (eine 
spezielle Art Bank-Switching). Das steht alles im entsprechenden 
Datenblatt.

> das Steinchen davor geld wird?

Das weiß ich auch nicht. Dr. Freud?

von Simon (Gast)


Lesenswert?

Markus F. schrieb:
> MicroChip ihre 8-Bit Prozessoren auf 16 Bits "hochgerüstet"

Das hört sich so gemogelt an :-)

von Bronco (Gast)


Lesenswert?

Die PIC24-Mikrocontroller haben getrennte Adressbereich für Daten (RAM) 
und Code (Flash). Das nennt man Harvard-Architektur.

Es gibt also die Adresse 0x1000 zweimal:
Einmal im RAM, und einmal im Flash.

Beim C30-Compiler (Vorgänger des XC16) war es so, daß ein
1
const char *x = "bla";
ins Flash gelegt wird.
Du mußt also dem PIC24 sagen, daß er den String aus dem Flash holen soll 
und nicht aus dem RAM. Dies kann entweder "zu Fuß" mit den 
TBLRD-Befehlenmachen oder elegant über PSV ("Program Space Visibility"):
In einem bestimmten RAM-Adressbereich wird ein Teil des 
Flash-Adressbereiches eingeblendet. Allerdings ist dies nur ein kleiner 
Teil und welcher Teil das ist, wird über ein SpecialFunctionRegister 
bestimmt.
I.d.R. kümmert sich der Compiler selbst darum, alle Strings und 
Konstanten im Flash so zusammenzulegen, daß man sie komplett in den 
PSV-Bereich einblenden kann.

Details findest Du in der Doku vom Compiler.

PS: Das hat nix mit Mogelei zu tun. Bei AVR und 8051 geht ein Zugriff 
ins Flash nur über bestimmte Befehle, ein PSV gibt es da nicht.

von Simon (Gast)


Lesenswert?

Danke

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.