Zitat 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 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 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