Rolf M. schrieb:
> Jim M. schrieb:
>> Walter K. schrieb:
>>> /* Linker */
>>> avr-ld test.o -o test.elf
>>
>> Wird nicht passen, AVR ist multi-lib. Da nimmt man zum Linken den GCC
>> als Frontend, also auch einfach "avr-gcc". Auch da ist der MCU Typ
>> anzugeben.
>
> Dann muss man aber noch explizit dafür sorgen, dass Startup-Code und
> Standardlib für C nicht mitgelinkt werden, also -nostdlib als
> zusätzlichen Parameter übergeben.
Müssen?
Man kann auch den C Startup-Code in Assembler verwenden, etwa für
1 | .data
|
2 | .global var
|
3 | var:
|
4 | .word 42
|
5 | ;; Triggert Teil des Startup-Codes
|
6 | .global __do_copy_data
|
bereits beim Einsprungpunkt in den Assmbler-Code (main) initialisiert zu
haben.
Außerdem hat man damit bereits eine Vector-Tabelle aus dem crt und man
kann also auch ohne jegliches C-Modul vom C-Startup profitieren. Ein
minimales main.S wäre dann z.B.:
1 | #include <avr/io.h>
|
2 |
|
3 | .text
|
4 |
|
5 | ;;; C-Startup definiert vectors-Tabelle, und avr/io.h definiert
|
6 | ;;; ISR names wie INT0_vect.
|
7 |
|
8 | .global INT0_vect
|
9 | INT0_vect:
|
10 | ;; Code
|
11 | reti
|
12 |
|
13 | ;;; C-Startup springt nach Initialisierung von .data und .bss nach main
|
14 |
|
15 | .global main
|
16 | main:
|
17 | ;; Code
|
und einfach übersetzen mit
1 | avr-gcc main.S -o main.elf -mmcu=...
|