Forum: Compiler & IDEs Fehler beim Kompilieren (AtMega328)


von Fer T. (fer_t)


Angehängte Dateien:

Lesenswert?

Hallo,
Ich habe einige Compiler Fehler, kann aber nicht raus finden, was ich 
falsch gemacht habe:

> Compiling: main.c
> avr-gcc -c -mmcu=atmega328p -I. -gdwarf-2   -Os -funsigned-char 
-funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes 
-Wa,-adhlns=main.lst -I/home/ferdinand/Dokumente/programmieren/AVR/Libs -std=gnu99 
-DF_OSC=8000000 -MD -MP -MF .dep/main.o.d main.c -o main.o
> main.c:49: error: expected identifier or '(' before numeric constant
> main.c:49: error: expected identifier or '(' before numeric constant
> main.c:88:21: error: invalid suffix "+I2C_WRITE" on integer constant
> main.c:95:21: error: invalid suffix "+I2C_WRITE" on integer constant
> main.c: In function 'main':
> main.c:209: error: 'MMC_FILE_NEW' undeclared (first use in this function)
> main.c:209: error: (Each undeclared identifier is reported only once
> main.c:209: error: for each function it appears in.)
> main.c:209: error: too few arguments to function 'ffopen'
> main.c:213: warning: pointer targets in passing argument 1 of 'ffwrites' differ 
in signedness
> main.c:221: error: 'MMC_FILE_EXISTS' undeclared (first use in this function)
> main.c:221: error: too few arguments to function 'ffopen'
> main.c:228: warning: pointer targets in passing argument 1 of 'ffwrites' differ 
in signedness
> main.c:238: warning: pointer targets in passing argument 1 of 'ffwrites' differ 
in signedness
> main.c:245: warning: pointer targets in passing argument 1 of 'ffwrites' differ 
in signedness


Vor allem die ersten Fehler, also Zeile 49 und der Fehler in Zeile 88/95 
überraschen mich, ich hab da alles so gemacht, wie es in den Tutorials 
immer beschrieben wird, aber irgendwie ist es trotzdem falsch.
z.B. Zeile 49ff:
1
ISR (INT0){
2
 if(loggen == 0x00){
3
  loggen = 0x01;
4
 }else{
5
   loggen = 0x00;
6
 }
7
}

Wobei:
1
volatile int8_t loggen = 0x00;

Ich sehe da nicht wo ich noch eine Klammer setzten sollte...

Weiß jemand, was ich falsch gemacht habe?
Ich weiß mein Code ist nicht der übersichtlichste, aber ich bin noch am 
lernen ;-) (<-- deswegen auch gerne Hinweise dazu :D)
Danke schon mal :D

MfG

von Krapao (Gast)


Lesenswert?

Schau dir den Namen des Vektors an der in diese Zeile gehört:
> ISR (INT0){
INT0 ist ein symbolischer Name für ein Bit und passt hier nicht.

von Krapao (Gast)


Lesenswert?

> main.c:88:21: error: invalid suffix "+I2C_WRITE" on integer constant

Wo ist das Makro I2C_WRITE definiert?

von Krapao (Gast)


Lesenswert?

>   if (MMC_FILE_NEW == ffopen(file_name))

dito. für die symbolischen Rückgabewert MMC_FILE_NEW muss es irgendwo 
ein #define geben, sonst nimmt der Compiler an, es handelt sich um eine 
Variable.

von Krapao (Gast)


Lesenswert?

> main.c:221: error: too few arguments to function 'ffopen'

Da fehlt ein Argument für die Funktion ffopen. Ich schätze man muss 
angeben, ob die Datei zum Lesen oder zum Schreiben geöffnet werden soll.

von Fer T. (fer_t)


Lesenswert?

Ok, da habe ich mich im Datenblatt verlesen, heißt EXT_INT0, wenn ich es 
ändere, bekomme ich:
> main.c:49: warning: 'EXT_INT0' appears to be a misspelled signal handler

Ok wenigstens keine error, sondern "nur" eine Warnung, auch wenn ich 
nicht weiß warum...

Das Makro I2C_WRITE wird in der i2cmaster.h definiert (von Peter Fleury)
1
/** defines the data direction (reading from I2C device) in i2c_start(),i2c_rep_start() */
2
#define I2C_READ    1
3
4
/** defines the data direction (writing to I2C device) in i2c_start(),i2c_rep_start() */
5
#define I2C_WRITE   0

Komischer weise ist das genau so auch in der Beispieldatei.

MMC_FILE_NEW ist erklärt in der mmc_config.h

Hab den Fehler hier aber auch schon gefunden, hab den Code einfach aus 
dem Tutorial hier übernommen 
(http://www.mikrocontroller.net/articles/AVR_FAT32) aber anscheinend 
haben sich die Namen geändert und wurden hier noch nicht erneuert.

Insgesamt erhalte ich jetzt die Meldung:

> main.c:49: warning: 'EXT_INT0' appears to be a misspelled signal handler
> main.c:88:21: error: invalid suffix "+I2C_WRITE" on integer constant
> main.c:95:21: error: invalid suffix "+I2C_WRITE" on integer constant
> main.c: In function 'main':
> main.c:209: error: too few arguments to function 'ffopen'
> main.c:213: warning: pointer targets in passing argument 1 of 'ffwrites' > 
differ in signedness
> main.c:221: error: too few arguments to function 'ffopen'
> main.c:228: warning: pointer targets in passing argument 1 of 'ffwrites' > 
differ in signedness
> main.c:238: warning: pointer targets in passing argument 1 of 'ffwrites' > 
differ in signedness
> main.c:245: warning: pointer targets in passing argument 1 of 'ffwrites' > 
differ in signedness
> main.c: In function 'makeString':
> main.c:269: warning: function returns address of local variable
> make: *** [main.o] Fehler 1

von Karl H. (kbuchegg)


Lesenswert?

Fer T. schrieb:
> Ok, da habe ich mich im Datenblatt verlesen, heißt EXT_INT0, wenn ich es
> ändere, bekomme ich:

er heißt auch nicht EXT_INT0, weil im gcc alle ISR-Handler Vektoren 
immer hinten ein "_vect" haben. Wenn schon, dann heißt er also

   EXT_INT0_vect


> Komischer weise ist das genau so auch in der Beispieldatei.

Fang mit dem ersten Fehler an.
Es kommt des öfteren vor, dass Fehler nur deswegen entstehen, weil 
vorher schon etwas gravierendes falsch war und der COmpiler nicht mehr 
dieselbe Sicht der Dinge hat wie du. Nennt man: Folgefehler. Korrigierst 
du den ersten Fehler, dann verschwinden Folgefehler ganz von alleine.

von Karl H. (kbuchegg)


Lesenswert?

> Hab den Fehler hier aber auch schon gefunden, hab den Code
> einfach aus dem Tutorial hier übernommen
> (http://www.mikrocontroller.net/articles/AVR_FAT32) aber anscheinend
> haben sich die Namen geändert und wurden hier noch nicht erneuert.


Im Zweifelsfall gilt immer das Header File, das du hast und nicht 
irgendein Tutorial. Du hast das Header File, also sieh rein wieviele 
Parameter zb ffopen haben will, welche Datentypen sie haben und was sie 
bedeuten.

von Fer T. (fer_t)


Lesenswert?

Danke :D

Hab jetzt mal das ganze so umgebaut (ffopen etc.), dass es nach dem 
headerfile valide ist, jetzt bekomme ich nur noch die Fehler:

> main.c:49: warning: 'EXT_INT0_vect' appears to be a misspelled signal handler
> main.c:88:21: error: invalid suffix "+I2C_WRITE" on integer constant
> main.c:95:21: error: invalid suffix "+I2C_WRITE" on integer constant
> main.c: In function 'main':
> main.c:216: warning: pointer targets in passing argument 1 of 'ffwrites' > 
differ in signedness
> main.c:225: warning: pointer targets in passing argument 1 of 'ffwrites' > 
differ in signedness
> main.c:232: warning: pointer targets in passing argument 1 of 'ffwrites' > 
differ in signedness
> main.c: In function 'makeString':
> main.c:256: warning: function returns address of local variable
> make: *** [main.o] Fehler 1

Also trotz _vect noch immer ein Fehler?
Naja nur noch 2 Fehler und der Rest sind Warnungen... Weiß jemand, was 
"differ in signedness" zu bedeuten hat?
MfG

von Karl H. (kbuchegg)


Lesenswert?

Fer T. schrieb:
> Danke :D
>
> Hab jetzt mal das ganze so umgebaut (ffopen etc.), dass es nach dem
> headerfile valide ist, jetzt bekomme ich nur noch die Fehler:
>
>> main.c:49: warning: 'EXT_INT0_vect' appears to be a misspelled signal handler

Für deinen Prozessor ist das Header File

iom328p.h

zuständig. Findet sich in der WinAVR Installation im Subverzeichnis 
avr/include/avr. Dort gibt es für jeden Prozessortyp ein Header File. 
Dieses Header File ist es, welches letztendlich durch

#include <avr/io.h>

hereingezogen wird. Durch die ANgabe des Prozessortyps im Makefile, 
verzweigt dann io.h zum jeweils richtigen Header File.

Wenn alle Stricke reißen, dann macht man dieses Header File auf und 
sieht dort nach.

Also  iom328p.h  aufmachen.
nach INT0 suchen
Und siehe da, der erste Eintrag der passt lautet
1
#define INT0_vect         _VECTOR(1)   /* External Interrupt Request 0 */

Jetzt hast du deinen Namen.  INT0_vect

> Also trotz _vect noch immer ein Fehler?
Weil der Name nicht stimme. Du kannst auch SCHNURDIBUR_vect 
hinschreiben. Nur kennt den eben keiner und es hagelt einen "appears to 
be a misspelled signal handler" Fehler.

von Karl H. (kbuchegg)


Lesenswert?

Der
> invalid suffix "+I2C_WRITE" on integer constant
ist allerdings interessant

Mach da mal ein paar Leerzeichen rein

    i2c_start_wait( 0xA0 + I2C_WRITE );     // EEPROM Adresse

Ist sowieso nicht gut für die Augen, wenn du so knirsch an knirsch 
schreibst. :-)

von Fer T. (fer_t)


Lesenswert?

Oh danke, ich hatte nur in das Datenblatt geguckt und da stand dann 
drinnen: EXT_INT0 also dachte ich, dass es das wäre oO
MfG

von Fer T. (fer_t)


Lesenswert?

Ok, die Fehler sind raus (nur noch Warnungen), jetzt bekomme ich aber 
Linker Fehler, wie z.B.

> mmc.c:464: undefined reference to `TimingDelay'

Ich habe mir das mal angeguckt, aber wirklich die Lösung finden tue ich 
nicht (ist die besagt MMC/SD Lib von Daniel R.).
Komisch...

von Fer T. (fer_t)


Lesenswert?

JA! :D

> Errors: none
> -------- end --------

geschafft :D


Auch wenn noch Warnungen da sind:
> main.c:235: warning: pointer targets in passing argument 1 of 'ffwrites' differ 
in signedness
> main.c:244: warning: pointer targets in passing argument 1 of 'ffwrites' differ 
in signedness
> main.c:251: warning: pointer targets in passing argument 1 of 'ffwrites' differ 
in signedness

Aber die verstehe ich leider nicht (Und es ist noch mal eine weniger 
(bei dem return ... musste nur ein static hin :D)

MfG


PS: 29,2 Kb HEX Datei ist nicht gut oder? Für so eine kleine Aufgabe 
(aus meiner Sicht). Komisch...

von Karl H. (kbuchegg)


Lesenswert?

Fer T. schrieb:
>
> Aber die verstehe ich leider nicht (Und es ist noch mal eine weniger
> (bei dem return ... musste nur ein static hin :D)

Na, was ist denn die signedness?
-> Die Fähigkeit ein Vorzeichen zu haben.

Es gibt signed Variablen und es gibt unsigned Variablen.
Die einen haben ein Vorzeichen, die anderen nicht.

Und was ist ein pointer target?

Das Ziel, also dort wo ein Zeiger hinzeigt.

Du hast also einen Pointer, zb
   unsigned int* pPointer;

und diesen Pointer (der ja eigentlich auf einen unsigned int zeigen 
sollte), lässt du auf einen signed int zeigen:

   int i;

   pPointer = &i;

und schon hast du einen 'Pointer target differs in signedness'

Bei dir ist es eine Variation davon:
pointer targets in passing argument 1 of 'ffwrites' differ in signedness

Da ist also von passing argument die Rede.
Das Prinzip ist nach wie vor dasselbe:

Du hast eine Funktion die einen Pointer auf zb einen unsigned int haben 
möchte

void foo( unsigned int* pPointer )
{
  ...
}

und beim Aufruf versuchst du diesem Pointer die Adresse einer signed 
Variablen unterzujubeln

int main()
{
  int i;

  foo( &i );
}

von Karl H. (kbuchegg)


Lesenswert?

> PS: 29,2 Kb HEX Datei ist nicht gut oder? Für so eine kleine
> Aufgabe (aus meiner Sicht). Komisch...

... sagte der BWL-er der nur in seinem Buero sitzt und nicht mitkriegt, 
dass die anderen für ihn die Arbeit machen. :-)

Soll keine Beleidigung sein.
Aber du verwendest doch haufenweise fremdes Zeugs, das dir die 
Drecks-Arbeit abnimmt.

Aber abgesehen davon zieht dir das hier zb
1
double Get2_x(uint8_t wert){
2
  double ret = 1.0;
3
  while(wert != 0){
4
    ret = ret * 2.0;
5
    wert--;
6
  }
7
  return ret;
8
}

die Floating Point Library rein. Brauchst du diese Funktion tatsächlich? 
Welches ist der Wertebereich des Arguments? Muss das alles wirklich in 
double ausgeführt sein?

von Fer T. (fer_t)


Lesenswert?

Danke!
Hab jetzt auch keine Warnungen mehr :D

Bin sicherlich kein BWLer ;-)
Hab mal nach gerechnet (max Wert ist 2^16 also um 1 zu groß für int, 
aber mit einem kleinen Trick, passt es trotzdem)


Sind jetzt schon 0,4 Kb weniger und dabei einfach nur einen Datentyp 
geändert oO

Nochmals danke für die Hilfe.

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


Lesenswert?

Karl Heinz Buchegger schrieb:
> Der
>> invalid suffix "+I2C_WRITE" on integer constant
> ist allerdings interessant
>
> Mach da mal ein paar Leerzeichen rein
>
>     i2c_start_wait( 0xA0 + I2C_WRITE );     // EEPROM Adresse

Yep, über sowas habe ich mich auch schon mal gewundert ... der GCC
ist hier völlig im Recht, musste ich mich dann belehren lassen.  Der
C-Standard hat vorsätzlich nur relativ grobe Regeln dafür, welche
Zeichen alles eine Zahl bilden.  Der Grund ist, dass man die
lexikalische Analyse nicht übermäßig verkomplizieren (und damit
verlangsamen) möchte.  Da nun aber "1.0E+5" eine gültige Zahl ist
und auch "0X2P23F" oder "1234ULL", behandelt der Parser nachgesetzte
Plus- oder Minuszeichen sowie darauf folgende Buchstaben immer als
Bestandteil der zu parsenden Zahl.

Wenn man sich angewöhnt, um + oder - immer Leerzeichen zu schreiben,
kann man in diese Falle nicht tappen.

von Fer T. (fer_t)


Lesenswert?

Jörg Wunsch schrieb:
> Wenn man sich angewöhnt, um + oder - immer Leerzeichen zu schreiben,
> kann man in diese Falle nicht tappen.

Danke, werde ich mir merken :D

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.