Forum: Compiler & IDEs Portierung von AVR zu PC (Fehlermeldungen)


von Malte _. (malte) Benutzerseite


Lesenswert?

Hallo,
ich versuche gerade ein Programm welches sich ohne Warungen/Fehler für
einen AVR compilieren lässt auch auf meinem PC zum laufen zu bringen.
Compilieren kann ich es auch bereits auf dem PC, aber ich bekomme
diverse Warnungen, die ich mir so nicht erklären kann.

Als erstes wäre da
1
const uint8_t end = strlen(textbuff);
Die Fehlermeldung ist:
Warnung: Zeigerziele bei Übergabe des Arguments 1 von »strlen«
unterscheiden sich im Vorzeichenbesitz
Aber zwischen libc und avr-libc erkenne ich dort keinen Unterschied:
http://www.gnu.org/software/libc/manual/html_mono/libc.html#String%20Length
http://www.nongnu.org/avr-libc/user-manual/group__avr__string.html#ga17

Zum Zweiten musste ich die speziellen Funktionen um Konstanten aus dem
Flash zu lesen deaktivieren. Da aber der gleiche Quellcode auch
weiterhin im AVR laufen soll habe ich kurzerhand
1
#define PGM_VOID_P void*
2
#define PROGMEM
3
#define memcpy_P memcpy
4
5
u08 pgm_read_byte(u08 *data) {
6
return *data;
7
}
8
9
u16 pgm_read_word(u16 *data) {
10
return *data;
11
}

in einer extra Datei definiert, die dann nur bei der Compilierung für
den PC eingebunden wird.
Dort bekomm ich aber stets Warnungen wie:
Warnung: Übergabe des Arguments 1 von »pgm_read_byte« entfernt
Kennzeichner von Zeiger-Ziel-Typ

Hat jemand Tips wie ich meinen Code korrieren muss so dass der Compiler
keinen Grund mehr zur Beschwerde hat?

Darüberhinaus, weiß jemand wie ich die Fehlermeldungen auf englisch
umstelle? Da sich mit den englischen Fehlermeldungen doch deutlich mehr
Problemfälle (und Lösungen) mit Google finden ließen.

Schon mal Danke im Voraus

von Karl H. (kbuchegg)


Lesenswert?

> Als erstes wäre daconst uint8_t end = strlen(textbuff);
> Die Fehlermeldung ist:
> Warnung: Zeigerziele bei Übergabe des Arguments 1 von »strlen«
> unterscheiden sich im Vorzeichenbesitz

Oh, Mann. Deutsche Fehlermeldungen.

Auf Englisch wuerde die Meldung wahrscheinlich lauten:
signed/unsigned mismatch in pointer argument 1 to strlen

Na klingelts jetzt?

> Warnung: Übergabe des Arguments 1 von »pgm_read_byte« entfernt
> Kennzeichner von Zeiger-Ziel-Typ

passing argument1 discards qualifier.

wahrscheinlich rufst Du die Funktion mit einem const Pointer
irgendwo auf.

> Darüberhinaus, weiß jemand wie ich die Fehlermeldungen auf englisch
> umstelle?

Keine Ahnung.
Ist aber eine weise Entscheidung dies zu tun.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

> Darüberhinaus, weiß jemand wie ich die Fehlermeldungen auf englisch
> umstelle?

export LANG=C

von Malte _. (malte) Benutzerseite


Lesenswert?

Danke, damit konnte ich die Warnungen auflösen :-)

Also bei
1
const uint8_t end = strlen(textbuff);

war die Lösung dass textbuff vom Typ uint8_t war, was beim avr-gcc mit
dem Typ char zusammenpasste, beim normalem gcc jedoch nicht. Ändern des
Typs auf char löste dass Problem, ohne Nachteile (in Punkto
Speicherverbrauch) bei der Compilierung für den AVR zu haben.

Die anderen Warnungen ließen sich durch Ergänzen von const lösen:
1
#define PGM_VOID_P const void*
2
#define PROGMEM
3
#define memcpy_P memcpy
4
5
u08 pgm_read_byte(const u08 *data) {
6
return *data;
7
}
8
9
u16 pgm_read_word(const u16 *data) {
10
return *data;
11
}

von Εrnst B. (ernst)


Lesenswert?

Schau auch mal dein Makefile durch, vermutlich sind da GCC-Optionen
gesetzt wie:

-funsigned-char -funsigned-bitfields -fshort-enums

Die Verstellen die gcc Default Datentypen, "char" ist dann unsigned
char, enums sind short statt int...

Die selben Optionen müssten aber auch für den i386er-GCC funktionieren,
dann sollte sich das Problem von selbst lösen...

/Ernst

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.