Du solltest auch deine Assembler-Programme immer mit
beginnen.
Alternative 1:
Du kannst das Assembler-Programm ähnlich wie ein C-Programm gestalten
und mit
1 | avr-gcc -mmcu=atmega1284p -o test.elf test.S
|
bauen.
Hier kannst du nachlesen, wie das Assemblerprogramm aussehen muss, damit
diese Methode funktioniert:
http://www.nongnu.org/avr-libc/user-manual/assembler.html
Der Vorteil besteht darin, dass die Interruptvektortabelle automatisch
generiert wird. Die C-Startup-Dateien werden zum Programm hinzugelinkt,
was erwünscht sein kann oder auch nicht.
Alternative 2:
Wenn du die volle Kontrolle über den generierten Code haben möchtest,
baust du es mit
1 | avr-gcc -mmcu=atmega1284p -nostdlib -o test.elf test.S
|
Dann musst du die Interruptvektortabelle selber schreiben, kannst sie
aber auch weglassen, wenn du keine Interrupts benutzt. Es werden auch
keine Startup-Dateien gelinkt, so dass das fertige Programm wirklich nur
den Code enthält, der in deiner Quelldatei steht. Der Einstiegspunkt
muss in diesem Fall auch nicht main heißen. Dein Beispielprogramm von
oben würde mit dieser Methode direkt funktionieren, wenn du die Include-
Datei in avr/io.h änderst.