Hallo, bei meinen Übungen mit der C-Programmierung des Atmel AVR bin ich inzwischen bei den Pointern angekommen. Ich wolle mal die einfachen Beispiele aus dem angegebenen Buch ausprobieren und es hagelt Fehlermeldungen, die ich nicht beseitigen kann. Das erste Übungsprogramm soll beispielsweise mir die Inhalte mehrerer Speicherstellen auf den PORT ausgeben. wenn ich den Zeiger um eins erhöhe, soll die nächste Speicherstelle z.B. aus dem SRAM ausgegeben werden. AVR Studio 4.18.684 AVR Simulator 1, 0, 2, 1 AVR-Studio steuert diesen GCC-Compiler: WinAVR-20100110 Kann mir da jemand bitte mit Tipps weiterhelfen? mit freundlichem Gruß Röhrenvorheizer #include <avr/io.h> // Deklarationen #define TAKT 1000000UL // Controllertakt 1 MHz unsigned char *px, x; px = &x; *px =1; void main (void) { while (1) { PORTB = *px; x++; } } /* Build started 1.10.2012 at 21:40:45 avr-gcc -mmcu=at90s2313 -Wall -gdwarf-2 -Os -std=gnu99 -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT Pointer_S219.o -MF dep/Pointer_S219.o.d -c ../Pointer_S219.c ../Pointer_S219.c:82: warning: data definition has no type or storage class ../Pointer_S219.c:82: warning: type defaults to 'int' in declaration of 'px' ../Pointer_S219.c:82: error: conflicting types for 'px' ../Pointer_S219.c:81: error: previous declaration of 'px' was here ../Pointer_S219.c:82: warning: initialization makes integer from pointer without a cast ../Pointer_S219.c:83: warning: data definition has no type or storage class ../Pointer_S219.c:83: warning: type defaults to 'int' in declaration of 'px' ../Pointer_S219.c:83: error: conflicting types for 'px' ../Pointer_S219.c:81: error: previous declaration of 'px' was here ../Pointer_S219.c:83: warning: initialization makes pointer from integer without a cast ../Pointer_S219.c:86: warning: return type of 'main' is not 'int' make: *** [Pointer_S219.o] Error 1 Build failed with 4 errors and 7 warnings... _______________________ Das da hier läßt sich direkt simulieren: //Buch G.Schmitt Seite 260 Kapitel Funktionen 3.5.3 Die Übergabe von Referenzen (Adressen) #include <avr/io.h> // Deklarationen #define TAKT 1000000UL // Controllertakt 1 MHz void test1 (char x) //Funktion gibt argument + 1 aus { PORTB = x + 1; //Argument + 1 ausgeben } void test2 (char x) //Funktion gibt Argumet + 2 aus { PORTB = x + 2; //Argument + 2 ausgeben } void test (void (*func) (char), char wert) //Funktion als Argument { func (wert); } void main (void) { DDRB = 0xFF; while (1) { test(test1,1); //Funktion test1 gibt 1+1 aus test(test2,1); //Funktion test2 gibt 1+2 aus } }
Du versuchst Code außerhalb von Funktionen auszuführen und deine main hat den falschen Rückgabetyp. Allgemein ist es sehr gefährlich mit Pointern im Speicher rumzuwurschteln...
Christian S. schrieb: > #define TAKT 1000000UL // Controllertakt 1 MHz Normalerweise definiert man dafür F_CPU, weil die delay.h damit arbeitet. > unsigned char *px, x; > px = &x; > *px =1; Das gehört bestimmt in die main().
Hallo , danke erstmal, so geht's jetzt. Das genügt für weitere Experimente. Wie bekomme ich die Warnung noch weg? Ist das relevant? Gruß Roehrenvorheizer #include <avr/io.h> // Deklarationen #define F_CPU 1000000UL // Controllertakt 1 MHz void main (void) { unsigned char *px, x; px = &x; *px =1; while (1) { PORTB = *px; x++; } } Build started 1.10.2012 at 22:54:56 ../Pointer_S219.c:86: warning: return type of 'main' is not 'int' avr-gcc -mmcu=at90s2313 -Wl,-Map=Zeiger_S219.map Pointer_S219.o -o Zeiger_S219.elf avr-objcopy -O ihex -R .eeprom -R .fuse -R .lock -R .signature Zeiger_S219.elf Zeiger_S219.hex avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 --no-change-warnings -O ihex Zeiger_S219.elf Zeiger_S219.eep || exit 0 avr-objdump -h -S Zeiger_S219.elf > Zeiger_S219.lss AVR Memory Usage ---------------- Device: at90s2313 Program: 48 bytes (2.3% Full) (.text + .data + .bootloader) Data: 0 bytes (0.0% Full) (.data + .bss + .noinit) Build succeeded with 1 Warnings...
Dabei sagt er doch schon alles:
> warning: return type of 'main' is not 'int'
Dein Rückgabetyp von main() ist derzeit nicht "int". Wo er Recht hat,
hat er Recht. Also schnell den Rückgabetyp der Funktion main() auf "int"
ändern...
Laut ANSI Standard gibt "main" immer integer zurück. Der Rahmen muss also wie folgt aussehen: int main(void) { ... return 0; } Statt der 0 kannst du auch einen Fehlercode zurückgeben. Das ist allerdings nur von Interesse, wenn die Rückgabe z.B. unter Windows von einem Script abgefragt wird. Beim AVR ist das rein akademisch. Grüße Checker Bunny
Moin, oder man macht es so: int __attribute__((OS_main)) main(void) { unsigned char *px, x; px = &x; *px =1; while (1) { PORTB = *px; x++; } } MfG
...oder so.
1 | __attribute__ ((noreturn)) void main(void) { |
2 | ...
|
3 | }
|
und übersetzen mit dem Schalter "-ffreestanding". mfg
** Lötlackl schrieb: > [...] und übersetzen mit dem Schalter "-ffreestanding". Das willst du nicht wirklich. Das hat weitaus mehr Auswirkungen als main zur void-Funktion zu machen.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.