Forum: Mikrocontroller und Digitale Elektronik Texte in const char * initialisieren und benutzen


von Holler (Gast)


Lesenswert?

Es geht um Konstanten im Programm-Speicher unter Atmel Studio 6.1, uC 
ist ein Atxmega.

Ich nutze zum Ausgeben von vordefinierten Texten auf eine UART 
normalweise eine Kontruktion wie

PGM_P text_eingabe="Eingabe : ";

wobei
#define PGM_P const char *
definiert ist.

Klappt prima, solange ich das direkt ins c-File schreibe und auch nur in 
diesem Modul benutze.

Ich möchte das aber gern in den Header schreiben und von überall da 
zugreifen, wo der Header eingebunden wird. Leider bekomme ich dann 
sofort Fehlermeldungen wie

Error  147  Disabling relaxation: it will not work with multiple 
definitions    1  1  USER_APPLICATION2

und

Error  146  first defined here  C:\Users\...\Debug\src\applic.o  1  1 
USER_APPLICATION2

Wie macht man es richtig?

von Marcel (Gast)


Lesenswert?

PGM_P text_eingabe="Eingabe : "; in die .c
extern PGM_P text_eingabe; in die .h

Zuweisungen sollten immer in .c Dateien erfolgen und wenn sie in anderen 
Dateien nötig sind per extern darauf verweisen. Der Verweis kann in 
einer .h oder in der .c stehen.

von Coder (Gast)


Lesenswert?

Ich vermute, dass pgm_p mehrfach deklariert wird. Du darfst das nur 
einmal deklarierten. Am besten im Header. Im Header
1
#ifndef header_h
2
#define header_h
3
Blabla
4
#endif
Nicht vergessen.

von Falk B. (falk)


Lesenswert?

PGM_P muss GAR nciht extra definiert werden, denn die Definitionsteckt 
schon in den Headerfiles vom avr gcc. Muss man "nur" richtg anwenden.

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Programmspeicher_.28Flash.29

von Holler (Gast)


Lesenswert?

Viel Dank, funktioniert nach Marcels Vorschlag perfekt.

Hatte übrigens PGM_P nicht selbst definiert sondern nur den Inhalt der 
pgmspace.c zur Erläuterung meines Problems zitiert.

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.