Hallo, ich habe ein ganz einfachtes Test-Programm, das eine LED zum leuchten bringt. Funktioniert auch. Wenn ich nun jedoch oberhalb der main() Methode eine neue Methode definiere, funktioniert gar nix mehr. Als würde die main() nie mehr aufgerufen!? Dabei ist egal, ob die neue Methode aufgerufen wird nicht. Weiß jemand, woran das liegen kann? Zum Beispiel: Folgender Code funktioniert: --------------------------- #include <avr/io.h> int main(void) { DDRB = 0xff; PORTB = 0xff; PORTB &= ~ (1<<PB0); while(1) { } return 0; } folgender Code funktioniert nicht: --------------------------------- #include <avr/io.h> void myTestFunction(void) { } int main(void) { DDRB = 0xff; PORTB = 0xff; PORTB &= ~ (1<<PB0); while(1) { } return 0; }
Wie sieht der generierte Assembler-Code in beiden Fällen aus (die .lss-Dateien, die avr-gcc auf Wunsch erzeugt)? btw: "Methoden" ist ein Begriff aus der objekt-orientierten Programmierung, du meinst "Funktionen".
Hallo, hier der *.lss Datei-Inhalt: Funktionierender Code (Ohne Funktion-Definition): ------------------------------------------------ Bandtuner.elf: file format elf32-avr Sections: Idx Name Size VMA LMA File off Algn 0 .text 000000dc 00000000 00000000 00000054 2**1 CONTENTS, ALLOC, LOAD, READONLY, CODE 1 .debug_aranges 00000020 00000000 00000000 00000130 2**0 CONTENTS, READONLY, DEBUGGING 2 .debug_pubnames 0000001b 00000000 00000000 00000150 2**0 CONTENTS, READONLY, DEBUGGING 3 .debug_info 00000076 00000000 00000000 0000016b 2**0 CONTENTS, READONLY, DEBUGGING 4 .debug_abbrev 00000041 00000000 00000000 000001e1 2**0 CONTENTS, READONLY, DEBUGGING 5 .debug_line 00000077 00000000 00000000 00000222 2**0 CONTENTS, READONLY, DEBUGGING 6 .debug_frame 00000020 00000000 00000000 0000029c 2**2 CONTENTS, READONLY, DEBUGGING 7 .debug_str 00000086 00000000 00000000 000002bc 2**0 CONTENTS, READONLY, DEBUGGING Disassembly of section .text: 00000000 <__vectors>: 0: 0c 94 46 00 jmp 0x8c ; 0x8c <__ctors_end> 4: 0c 94 65 00 jmp 0xca ; 0xca <__bad_interrupt> 8: 0c 94 65 00 jmp 0xca ; 0xca <__bad_interrupt> c: 0c 94 65 00 jmp 0xca ; 0xca <__bad_interrupt> 10: 0c 94 65 00 jmp 0xca ; 0xca <__bad_interrupt> 14: 0c 94 65 00 jmp 0xca ; 0xca <__bad_interrupt> 18: 0c 94 65 00 jmp 0xca ; 0xca <__bad_interrupt> 1c: 0c 94 65 00 jmp 0xca ; 0xca <__bad_interrupt> 20: 0c 94 65 00 jmp 0xca ; 0xca <__bad_interrupt> 24: 0c 94 65 00 jmp 0xca ; 0xca <__bad_interrupt> 28: 0c 94 65 00 jmp 0xca ; 0xca <__bad_interrupt> 2c: 0c 94 65 00 jmp 0xca ; 0xca <__bad_interrupt> 30: 0c 94 65 00 jmp 0xca ; 0xca <__bad_interrupt> 34: 0c 94 65 00 jmp 0xca ; 0xca <__bad_interrupt> 38: 0c 94 65 00 jmp 0xca ; 0xca <__bad_interrupt> 3c: 0c 94 65 00 jmp 0xca ; 0xca <__bad_interrupt> 40: 0c 94 65 00 jmp 0xca ; 0xca <__bad_interrupt> 44: 0c 94 65 00 jmp 0xca ; 0xca <__bad_interrupt> 48: 0c 94 65 00 jmp 0xca ; 0xca <__bad_interrupt> 4c: 0c 94 65 00 jmp 0xca ; 0xca <__bad_interrupt> 50: 0c 94 65 00 jmp 0xca ; 0xca <__bad_interrupt> 54: 0c 94 65 00 jmp 0xca ; 0xca <__bad_interrupt> 58: 0c 94 65 00 jmp 0xca ; 0xca <__bad_interrupt> 5c: 0c 94 65 00 jmp 0xca ; 0xca <__bad_interrupt> 60: 0c 94 65 00 jmp 0xca ; 0xca <__bad_interrupt> 64: 0c 94 65 00 jmp 0xca ; 0xca <__bad_interrupt> 68: 0c 94 65 00 jmp 0xca ; 0xca <__bad_interrupt> 6c: 0c 94 65 00 jmp 0xca ; 0xca <__bad_interrupt> 70: 0c 94 65 00 jmp 0xca ; 0xca <__bad_interrupt> 74: 0c 94 65 00 jmp 0xca ; 0xca <__bad_interrupt> 78: 0c 94 65 00 jmp 0xca ; 0xca <__bad_interrupt> 7c: 0c 94 65 00 jmp 0xca ; 0xca <__bad_interrupt> 80: 0c 94 65 00 jmp 0xca ; 0xca <__bad_interrupt> 84: 0c 94 65 00 jmp 0xca ; 0xca <__bad_interrupt> 88: 0c 94 65 00 jmp 0xca ; 0xca <__bad_interrupt> 0000008c <__ctors_end>: 8c: 11 24 eor r1, r1 8e: 1f be out 0x3f, r1 ; 63 90: cf ef ldi r28, 0xFF ; 255 92: d0 e1 ldi r29, 0x10 ; 16 94: de bf out 0x3e, r29 ; 62 96: cd bf out 0x3d, r28 ; 61 00000098 <__do_copy_data>: 98: 11 e0 ldi r17, 0x01 ; 1 9a: a0 e0 ldi r26, 0x00 ; 0 9c: b1 e0 ldi r27, 0x01 ; 1 9e: ec ed ldi r30, 0xDC ; 220 a0: f0 e0 ldi r31, 0x00 ; 0 a2: 00 e0 ldi r16, 0x00 ; 0 a4: 0b bf out 0x3b, r16 ; 59 a6: 02 c0 rjmp .+4 ; 0xac <__do_copy_data+0x14> a8: 07 90 elpm r0, Z+ aa: 0d 92 st X+, r0 ac: a0 30 cpi r26, 0x00 ; 0 ae: b1 07 cpc r27, r17 b0: d9 f7 brne .-10 ; 0xa8 <__do_copy_data+0x10> 000000b2 <__do_clear_bss>: b2: 11 e0 ldi r17, 0x01 ; 1 b4: a0 e0 ldi r26, 0x00 ; 0 b6: b1 e0 ldi r27, 0x01 ; 1 b8: 01 c0 rjmp .+2 ; 0xbc <.do_clear_bss_start> 000000ba <.do_clear_bss_loop>: ba: 1d 92 st X+, r1 000000bc <.do_clear_bss_start>: bc: a0 30 cpi r26, 0x00 ; 0 be: b1 07 cpc r27, r17 c0: e1 f7 brne .-8 ; 0xba <.do_clear_bss_loop> c2: 0e 94 67 00 call 0xce ; 0xce <main> c6: 0c 94 6c 00 jmp 0xd8 ; 0xd8 <_exit> 000000ca <__bad_interrupt>: ca: 0c 94 00 00 jmp 0 ; 0x0 <__vectors> 000000ce <main>: #include <avr/io.h> int main(void) { ce: 8f ef ldi r24, 0xFF ; 255 d0: 87 bb out 0x17, r24 ; 23 DDRB = 0xff; PORTB = 0xff; d2: 88 bb out 0x18, r24 ; 24 PORTB &= ~ (1<<PB0); d4: c0 98 cbi 0x18, 0 ; 24 d6: ff cf rjmp .-2 ; 0xd6 <main+0x8> 000000d8 <_exit>: d8: f8 94 cli 000000da <__stop_program>: da: ff cf rjmp .-2 ; 0xda <__stop_program> Nicht funktionierender Code (mit Funktions-Definition): --------------------------------------------------------- Bandtuner.elf: file format elf32-avr Sections: Idx Name Size VMA LMA File off Algn 0 .text 000000de 00000000 00000000 00000054 2**1 CONTENTS, ALLOC, LOAD, READONLY, CODE 1 .debug_aranges 00000020 00000000 00000000 00000132 2**0 CONTENTS, READONLY, DEBUGGING 2 .debug_pubnames 0000002e 00000000 00000000 00000152 2**0 CONTENTS, READONLY, DEBUGGING 3 .debug_info 0000008a 00000000 00000000 00000180 2**0 CONTENTS, READONLY, DEBUGGING 4 .debug_abbrev 00000056 00000000 00000000 0000020a 2**0 CONTENTS, READONLY, DEBUGGING 5 .debug_line 00000087 00000000 00000000 00000260 2**0 CONTENTS, READONLY, DEBUGGING 6 .debug_frame 00000030 00000000 00000000 000002e8 2**2 CONTENTS, READONLY, DEBUGGING 7 .debug_str 00000095 00000000 00000000 00000318 2**0 CONTENTS, READONLY, DEBUGGING Disassembly of section .text: 00000000 <__vectors>: 0: 0c 94 46 00 jmp 0x8c ; 0x8c <__ctors_end> 4: 0c 94 65 00 jmp 0xca ; 0xca <__bad_interrupt> 8: 0c 94 65 00 jmp 0xca ; 0xca <__bad_interrupt> c: 0c 94 65 00 jmp 0xca ; 0xca <__bad_interrupt> 10: 0c 94 65 00 jmp 0xca ; 0xca <__bad_interrupt> 14: 0c 94 65 00 jmp 0xca ; 0xca <__bad_interrupt> 18: 0c 94 65 00 jmp 0xca ; 0xca <__bad_interrupt> 1c: 0c 94 65 00 jmp 0xca ; 0xca <__bad_interrupt> 20: 0c 94 65 00 jmp 0xca ; 0xca <__bad_interrupt> 24: 0c 94 65 00 jmp 0xca ; 0xca <__bad_interrupt> 28: 0c 94 65 00 jmp 0xca ; 0xca <__bad_interrupt> 2c: 0c 94 65 00 jmp 0xca ; 0xca <__bad_interrupt> 30: 0c 94 65 00 jmp 0xca ; 0xca <__bad_interrupt> 34: 0c 94 65 00 jmp 0xca ; 0xca <__bad_interrupt> 38: 0c 94 65 00 jmp 0xca ; 0xca <__bad_interrupt> 3c: 0c 94 65 00 jmp 0xca ; 0xca <__bad_interrupt> 40: 0c 94 65 00 jmp 0xca ; 0xca <__bad_interrupt> 44: 0c 94 65 00 jmp 0xca ; 0xca <__bad_interrupt> 48: 0c 94 65 00 jmp 0xca ; 0xca <__bad_interrupt> 4c: 0c 94 65 00 jmp 0xca ; 0xca <__bad_interrupt> 50: 0c 94 65 00 jmp 0xca ; 0xca <__bad_interrupt> 54: 0c 94 65 00 jmp 0xca ; 0xca <__bad_interrupt> 58: 0c 94 65 00 jmp 0xca ; 0xca <__bad_interrupt> 5c: 0c 94 65 00 jmp 0xca ; 0xca <__bad_interrupt> 60: 0c 94 65 00 jmp 0xca ; 0xca <__bad_interrupt> 64: 0c 94 65 00 jmp 0xca ; 0xca <__bad_interrupt> 68: 0c 94 65 00 jmp 0xca ; 0xca <__bad_interrupt> 6c: 0c 94 65 00 jmp 0xca ; 0xca <__bad_interrupt> 70: 0c 94 65 00 jmp 0xca ; 0xca <__bad_interrupt> 74: 0c 94 65 00 jmp 0xca ; 0xca <__bad_interrupt> 78: 0c 94 65 00 jmp 0xca ; 0xca <__bad_interrupt> 7c: 0c 94 65 00 jmp 0xca ; 0xca <__bad_interrupt> 80: 0c 94 65 00 jmp 0xca ; 0xca <__bad_interrupt> 84: 0c 94 65 00 jmp 0xca ; 0xca <__bad_interrupt> 88: 0c 94 65 00 jmp 0xca ; 0xca <__bad_interrupt> 0000008c <__ctors_end>: 8c: 11 24 eor r1, r1 8e: 1f be out 0x3f, r1 ; 63 90: cf ef ldi r28, 0xFF ; 255 92: d0 e1 ldi r29, 0x10 ; 16 94: de bf out 0x3e, r29 ; 62 96: cd bf out 0x3d, r28 ; 61 00000098 <__do_copy_data>: 98: 11 e0 ldi r17, 0x01 ; 1 9a: a0 e0 ldi r26, 0x00 ; 0 9c: b1 e0 ldi r27, 0x01 ; 1 9e: ee ed ldi r30, 0xDE ; 222 a0: f0 e0 ldi r31, 0x00 ; 0 a2: 00 e0 ldi r16, 0x00 ; 0 a4: 0b bf out 0x3b, r16 ; 59 a6: 02 c0 rjmp .+4 ; 0xac <__do_copy_data+0x14> a8: 07 90 elpm r0, Z+ aa: 0d 92 st X+, r0 ac: a0 30 cpi r26, 0x00 ; 0 ae: b1 07 cpc r27, r17 b0: d9 f7 brne .-10 ; 0xa8 <__do_copy_data+0x10> 000000b2 <__do_clear_bss>: b2: 11 e0 ldi r17, 0x01 ; 1 b4: a0 e0 ldi r26, 0x00 ; 0 b6: b1 e0 ldi r27, 0x01 ; 1 b8: 01 c0 rjmp .+2 ; 0xbc <.do_clear_bss_start> 000000ba <.do_clear_bss_loop>: ba: 1d 92 st X+, r1 000000bc <.do_clear_bss_start>: bc: a0 30 cpi r26, 0x00 ; 0 be: b1 07 cpc r27, r17 c0: e1 f7 brne .-8 ; 0xba <.do_clear_bss_loop> c2: 0e 94 68 00 call 0xd0 ; 0xd0 <main> c6: 0c 94 6d 00 jmp 0xda ; 0xda <_exit> 000000ca <__bad_interrupt>: ca: 0c 94 00 00 jmp 0 ; 0x0 <__vectors> 000000ce <myTestFunction>: #include <avr/io.h> void myTestFunction(void) { ce: 08 95 ret 000000d0 <main>: } int main(void) { d0: 8f ef ldi r24, 0xFF ; 255 d2: 87 bb out 0x17, r24 ; 23 DDRB = 0xff; PORTB = 0xff; d4: 88 bb out 0x18, r24 ; 24 PORTB &= ~ (1<<PB0); d6: c0 98 cbi 0x18, 0 ; 24 d8: ff cf rjmp .-2 ; 0xd8 <main+0x8> 000000da <_exit>: da: f8 94 cli 000000dc <__stop_program>: dc: ff cf rjmp .-2 ; 0xdc <__stop_program>
Ich seh auf die Schnelle keinen Fehler. Aber könntest Du es mal so probieren? #include <avr/io.h> extern void myTestFunction(void); int main(void) { DDRB = 0xff; PORTB = 0xff; PORTB &= ~ (1<<PB0); while(1) { } return 0; } void myTestFunction(void) { }
Hallo, ja, mit extern klappts. Hab auch mal das Anmachen der LED in die Methode verschoben, funktioniert auch. Aber, warum klappt die Funktions-Definition oberhalb der main() nicht?
Bei der ersten Version liegt die Einspungadresse von main() bei 0xCE, bei der nicht funktionierenden liegt dort myTestFunction(). Kann es sein, dass das Programmiergerät nur die Funktionen, jedoch nicht die Startsequenz getauscht hat? Aber vorher muss man den AVR doch komplett löschen. Arbeitest Du unter AVR-Studio mit dem Simulator? Kannst Du mal alle erzeugten Files löschen einschliesslich Object, Hex-Files ... Dann nochmal alles neu compilieren. Taucht der Fehler dann auch noch auf? Gruss, Bernd
Ich benutze AVR Studio 4 und PonyProg2000 über LPT. Ich hatte das Programm auch paar mal mit dem Simulator gestartet. Wie du sagtest, Bernd, habe ich alle Ausgabe-Dateien entfernt und neu gebaut -> Das Problem ist immer noch da. Ich habe testweise auch ein neues AVR Studio-Projekt angelegt und nur den Source-Code kopiert -> Das Problem ist immer noch da. Ich hab im PonyProg auch mal den Knopf "Erase all of the device to FF" ausprobiert -> Das Problem ist immer noch da. Grüße, gustaven
Hallo, ich hab den Fehler nun selbst gefunden: Habe für den Atmega32 kompiliert (mit dem ich vorher rumgespielt hatte), obwohl ich aktuell einen AT90S4433 nutze. Grüße, gustaven
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.