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.