Asembler i C

To forum jest dla wszystkich pasjonatów mikrokontrolerów AVR Atmela. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
ODPOWIEDZ
smmutas

Asembler i C

Post autor: smmutas » 22 maja 2006, 15:35

Problem polega na połączeniu programu napisanego w GCC ( WinAVR) i asemblerze AVRStudio. Mikrokontroler musi działać z max szybkością ( kod napisany w asemblerze ok 1,5 kB ) a następnie dokonać złożonych obliczeń oraz przesłać dane na wyświetlacz i RS 232 (kod napisany w C ). potrzebna wiedza !! ( najlepiej po polsku ). Sprawa robi się poważna więc liczę na szybkie znalezienie rozwiązania.

jakobs
-
Posty: 1
Rejestracja: 27 maja 2006, 22:12
Lokalizacja: Łódź
Kontakt:

Post autor: jakobs » 27 maja 2006, 22:43

Witam,

Też mam podobny problem z GCC.
Z tego co się zorientowałem nie jest możliwe dołączenie asm skompilowanego przez AVR STUDIO. (inne formaty plików .obj GCC tego nie rozumie)
Po wielu próbach udało mi się w końcu skompilować C z modułami asm w GCC ale wymagało to wielu przeróbek.

Krotki opis:
1. Nalezy zdefiniować własny plik make (najlepiej wg. wzoru z katalogu WinAVR\sample\
2. Rozszerzenia plików asm należy zamienić na .S (pliki z rozszerzeniami .s są kasowane po CLEAN)
3. Ponieważ pliki asm są kompilowane przez wewnętrzy kompilator GGC wymagaja one sporych przeróbek. (.equ --> .set .... i wiele podobnych)
Poniewaz polecenie .org powoduje wyłącznie przesuniecie wzgledem biezącego licznika lokacji NIE NALEZY GO UŻYWAĆ.
Ewentualne absolutne określenie położenia kodu w asm możliwe jest poprzez ustalenie sekcji
np:
.section .nazwa_sekcji,"ax",@progbits
funasm:
ldi r0, 0xff
out _SFR_IO_ADDR(PORTB), r0

Wiecej pod adresem: http://www.nongnu.org/avr-libc/user-man ... tions.html

definicję obszaru należy umieścić w pliku make
np: EXTMEMOPTS = -Wl,--section-start,.nazwa_sekcji=0x1000 <--- polozenie sekcji

Więcej informacji na temat różnic dyrektyw asemblera gcc w pliku
......\WinAVR\doc\binutils\as\Pseudo-Ops.html

4. W nagłówku pliku żródłowego z asm ( xxxx.S) należy dopisać
#define __SFR_OFFSET 0
#include "avr/io.h"

Wiecej informacji patrz:
http://www.nongnu.org/avr-libc/user-man ... notes.html
http://www.nongnu.org/avr-libc/user-man ... mbler.html

---
Pozdrawiam Jacek K. (AVRSTUDIO 4.12 (build 472) +WinAVR v.20060421)

smmutas
-
Posty: 2
Rejestracja: 25 maja 2006, 17:53
Lokalizacja: Poznań

Post autor: smmutas » 29 maja 2006, 16:53

Dziękuję za odpowiedź. Jednak uważam że asembler w GCC jest strasznie porąbany. Czy komuś udało się połączyć program kompilowany w gcc z programem kompilowanym w AVRStudio. :sad: Przepisywanie plików w asemblerze wg gcc może mnie poważnie osłabić i przypuszczam że pojawią się błędy związane z ciekawym sposobem zapisu w tym assemblerze. :neutral:

[ Dodano: 2006-06-07, 16:07 ]
Mam postępy. Dzięki wskazówkom kompiluje się kod w C i prawdopodobnie asemblerowy ( to dwa odzielne pliki ). jednak na koniec otrzymuję coś takiego :



avr-gcc -Wa,-adhlns=przerwania.lst,-gstabs -Wl,-Map=pierwszy.map,--cref -lm przerwania.S -o przerwania
C:/WINAVR/BIN/../lib/gcc/avr/3.4.6/../../../../avr/lib/crts8515.o: In function `__vectors':
../../../../../avr-libc-1.4.4/crt1/gcrt1.S:51: undefined reference to `main'
make.exe: *** [przerwania] Error 1

Mam więc pytania :
1. O co chodzi z tym " undefined reference to `main' "
2. zdefiniowany jest w Makefile procek ATmega 162 wiec o co chodzi z " crts8515.o ".

Czy ktoś może mi w tym pomóc? :sad:

ODPOWIEDZ