Asembler i C
-
smmutas
Asembler i C
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.
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)
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)
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.
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.
[ 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?
[ 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?