[C] Wywołanie funkcji z kodu asm

0

Witam,

Usiłuję od dłuższego czasu wykonać funkcję znajdującą się w kodzie C.

main.c

void main_start(){
  for(;;);
}

start.S

#include <avr/io.h>
.text
.org	512 ; w pierwszych 512 bajtach jest bootloader
.extern main_start

rcall main_start

loop:
rjmp loop

Efekt mam taki:

$ avr-gcc -mmcu=atmega8 -c start.S
$ avr-gcc -mmcu=atmega8 -c main.c
$ avr-ld boot.o start.o main.o -o main.o
start.o:(.text+0x200): undefined reference to `main_start'

Co robię źle?

// W znacznikach asm na tym forum macie błąd. Wpisałem #include <avr/io.h> a w podglądzie jest #include <;avr/io.h>

0

Hm, przypadkiem na Linuksie symbole nie dostają '_' na początku? W tagach błędu generalnie nie ma, ten śmieszny GAS po prostu nie jest obsługiwany, nie mówiąc o składni dla mikrokontrolerów. Spróbuj:

.extern _main_start

rcall _main_start
0

No tak, spotkałem się z tym kiedyś, chyba jak pisałem system na PC, lecz tutaj to nic nie daje.
Wydaje mi się że chyba źle kompiluje, czegoś brakuje... No nie mam pojęcia co jest nie tak.

0

Czeekaj...

kisiciel napisał(a)

Efekt mam taki:

$ avr-gcc -mmcu=atmega8 -c start.S
$ avr-gcc -mmcu=atmega8 -c main.c
$ avr-ld boot.o start.o main.o -o main.o
start.o:(.text+0x200): undefined reference to `main_start'

Dlaczego main.o używasz jednocześnie jako wejście i wyjście?

Szczerze to chwilowo nie mam innych pomysłów, nie mam jak przetestować...

0

O widzisz, wszystko działa :-D
Wiedziałem że coś głupiego palnąłem.
Dzięki.

0

Jeszcze jedno pytanko mieszczące się w temacie.
Chcę funkcje main_start nazwać main, aby zachować "uniwersalność", "standardowość" czy jak to tam nazwać.

main.o: In function `main':
main.c:(.text+0x0): undefined reference to `__stack'
main.c:(.text+0x2): undefined reference to `__stack'

Kompilator znajdując funkcje main chce chyba dodać swój bootloader, czy jak w aplikacjach na system - nagłówki, inicjacje itp. Kod C ma być przerabiany na kod maszynowy, bez żadnych dodatków gdyż mój bootloader ma to wszystko w sobie.
Jaki parametr dodać do kompilatora aby tak nie mieszał?

0

Zapewne chodzi o opcję -nostdlib

 dla <code noframe>ld

. Ew. może być konieczne ręczne ustawienie entry pointu aplikacji - argument --entry

, ew. <code noframe>-e

. Trudno powiedzieć, nie miałem do czynienia z GCC dla AVR.

1 użytkowników online, w tym zalogowanych: 0, gości: 1