
Zitat von
McJenso
BTW Was macht der Controller, wenn er das Programm abgearbeitet hat?
In dem letzten Pinzustand bleiben (im falle meines Programms 0x00 an PortA).

Zitat von
McJenso
Es feht eine Endlosschleife wie z.B. while (1){};
Nett ist es die int main () mit return 0; abzuschließen. Das int steht immerhin für einen Rückgabewert.
Es handelt sich bei meinem Code nicht um den Code, den ich tatsaechlich verwende, sondern um eine soweit wie moeglich vereinfachte Form, um anderen, die vielleicht das selbe Problem haben, die Suche nach der Loesung so einfach wie moeglich zu machen.
Trotzdessen: Warum sollte ich eine Schleife verwenden, wenn der Zustand sowieso erhalten bleibt?
Und warum sollte ich ne Zahl zurueckgeben, wenn die sowieso von keinem Programm ausgelesen wird?
Habe grad mal drei unterschiedliche Varianten ausprobiert, die alle den gleichen ASM Code erzeugen:
Ohne return, main als int:
Code:
#include <avr/io.h>
int main() {
DDRA = 0xff;
PORTA = 0x00;
}
Mit return, main als int
Code:
#include <avr/io.h>
int main() {
DDRA = 0xff;
PORTA = 0x00;
return 0;
}
ohne return, main als void (mit warning: return type of 'main' is not 'int'):
Code:
#include <avr/io.h>
void main() {
DDRA = 0xff;
PORTA = 0x00;
}
Befehle zum Compilieren und Assemblercode erzeugen:
Code:
maratox ~/Programmieren/avr/test $ make
avr-gcc test.c -Os -g -mmcu=atmega8535 -c -o test.o
avr-gcc test.o -o test.elf -mmcu=atmega8535
avr-objcopy -j .text -j .data -O ihex test.elf test.hex
maratox ~/Programmieren/avr/test $ avr-objdump -d test.elf --source test.c
Assemblercode der drei Quellen:
Code:
[...]
00000062 <main>:
#include <avr/io.h>
int main() {
62: cf e5 ldi r28, 0x5F ; 95
64: d2 e0 ldi r29, 0x02 ; 2
66: de bf out 0x3e, r29 ; 62
68: cd bf out 0x3d, r28 ; 61
DDRA = 0xff;
6a: 8f ef ldi r24, 0xFF ; 255
6c: 8a bb out 0x1a, r24 ; 26
PORTA = 0x00;
6e: 1b ba out 0x1b, r1 ; 27
return 0;
}
70: 80 e0 ldi r24, 0x00 ; 0
72: 90 e0 ldi r25, 0x00 ; 0
74: 00 c0 rjmp .+0 ; 0x76 <_exit>
00000076 <_exit>:
76: ff cf rjmp .-2 ; 0x76 <_exit>
Da bei jeder Version dieser Code erzeugt wird ist es folglich egal, ob ich return hinschreib oder nicht, weil die return-Zahl sowieso nicht ausgewertet wird.

Zitat von
McJenso
BTW Was macht der Controller, wenn er das Programm abgearbeitet hat?
Er geht in eine Endlosschleife:
Code:
00000076 <_exit>:
76: ff cf rjmp .-2 ; 0x76 <_exit>
Danke fuer deine Hilfsbereitschaft
Lesezeichen