Aktyw Forum

Zarejestruj się na forum.ep.com.pl i zgłoś swój akces do Aktywu Forum. Jeśli jesteś już zarejestrowany wystarczy, że się zalogujesz.

Sprawdź punkty Zarejestruj się

Problem z kompilacją asm w AvrSide

Micha3
-
-
Posty:3
Rejestracja:14 maja 2004, o 21:47
Problem z kompilacją asm w AvrSide

Postautor: Micha3 » 5 lut 2006, o 20:08

Cześć

Mam następujący problem : próbuje skompilować przykładowy program napisany w asemblerze( z dokumentacji avrv-libc ):

Kod: Zaznacz cały

#include <avr/io.h> // ; Note [1] //#include "start.h" work = 16 ; Note [2] tmp = 17 temp = 16 inttmp = 19 intsav = 0 SQUARE = PD6 ; Note [3] ; Note [4]: tmconst= 10700000 / 200000 ; 100 kHz => 200000 edges/s fuzz= 8 ; # clocks in ISR until TCNT0 is set .section .text .global main ; Note [5] main: rcall ioinit 1: rjmp 1b ; Note [6] .global TIMER0_OVF_vect // ; Note [7] TIMER0_OVF_vect: ldi inttmp, 256 - tmconst + fuzz out _SFR_IO_ADDR(TCNT0), inttmp ; Note [8] in intsav, _SFR_IO_ADDR(SREG) ; Note [9] sbic _SFR_IO_ADDR(PORTD), SQUARE rjmp 1f sbi _SFR_IO_ADDR(PORTD), SQUARE rjmp 2f 1: cbi _SFR_IO_ADDR(PORTD), SQUARE 2: out _SFR_IO_ADDR(SREG), intsav reti .global ioinit ioinit: sbi _SFR_IO_ADDR(DDRD), SQUARE ldi work, _BV(TOIE0) out _SFR_IO_ADDR(TIMSK), work ldi work, _BV(CS00) ; tmr0: CK/1 out _SFR_IO_ADDR(TCCR0), work ldi work, 256 - tmconst out _SFR_IO_ADDR(TCNT0), work sei ret .global __vector_default ; Note [10] __vector_default: reti .end
Jeśli używam do tego celu make+ WinAVR nie ma problemu.
Gdy to samo wkleje do AvrSide wyskakują błedy(w dużej ilości).
Co może być tego przyczyną i jak to zlikwidować,
tak aby dało sięto skompilować pod AvrSide?

Jurek Szczesiul
-
-
Posty:175
Rejestracja:10 paź 2003, o 20:44
Lokalizacja:Białystok
Kontaktowanie:

Re: Problem z kompilacją asm w AvrSide

Postautor: Jurek Szczesiul » 5 lut 2006, o 22:24

Gdy to samo wkleje do AvrSide wyskakują błedy(w dużej ilości).
- Nowy projekt
- wklejam powyższy kod
- zapisuję plik jako np. main.s ( i projekt pod jakąś nazwą )
- kompiluje się (F9) bez problemów ( domyślna Atmega8 )
z zapisem operacji :

Kod: Zaznacz cały

Build Action : ================================ C:\AvrSide\gcc-3.4.4-2.16.1-1.4.0\bin\avr-gcc.exe -c -mmcu=atmega8 -x assembler-with-cpp -Wa,--gdwarf2 -DF_CPU=8000000UL main.s ............................................. C:\AvrSide\gcc-3.4.4-2.16.1-1.4.0\bin\avr-gcc.exe -mmcu=atmega8 -Wl,-Map=sasm.map,--cref -o sasm.elf main.o ............................................. C:\AvrSide\gcc-3.4.4-2.16.1-1.4.0\bin\avr-objdump.exe -h sasm.elf sasm.elf: file format elf32-avr Sections: Idx Name Size VMA LMA File off Algn 0 .text 00000062 00000000 00000000 00000094 2**0 CONTENTS, ALLOC, LOAD, READONLY, CODE 1 .data 00000000 00800060 00000062 000000f6 2**0 CONTENTS, ALLOC, LOAD, DATA 2 .bss 00000000 00800060 00000062 000000f6 2**0 ALLOC 3 .noinit 00000000 00800060 00800060 000000f6 2**0 CONTENTS 4 .eeprom 00000000 00810000 00810000 000000f6 2**0 CONTENTS ............................................. C:\AvrSide\gcc-3.4.4-2.16.1-1.4.0\bin\avr-nm.exe sasm.elf Symbols listed in "sasm.smb" file ............................................. C:\AvrSide\gcc-3.4.4-2.16.1-1.4.0\bin\avr-objdump.exe -S sasm.elf ............................................. C:\AvrSide\gcc-3.4.4-2.16.1-1.4.0\bin\avr-objcopy.exe -R .eeprom -O ihex sasm.elf sasm.hex .............................................
Czy właśnie to u Ciebie nie działa ?
Jakie są komunikaty błędów ?

Pozdrowienia Jurek S.

Micha3
-
-
Posty:3
Rejestracja:14 maja 2004, o 21:47

Postautor: Micha3 » 6 lut 2006, o 12:50

No tak... To był prosty błąd:
Zapisałem plik pod nazwą nazwa.S ->tak wymaga WinAVR, inaczej kasuje pliki podczas ponownej kompilacji
teraz zapisałem : nazwa.s (małe s) AvrSide kopiluje bez problemu.
Może mimktoś wyjaśnić dlaczego tak jest?

Jurek Szczesiul
-
-
Posty:175
Rejestracja:10 paź 2003, o 20:44
Lokalizacja:Białystok
Kontaktowanie:

Postautor: Jurek Szczesiul » 6 lut 2006, o 18:05

Zapisałem plik pod nazwą nazwa.S ->tak wymaga WinAVR, inaczej kasuje pliki podczas ponownej kompilacji
teraz zapisałem : nazwa.s (małe s) AvrSide kopiluje bez problemu.
Może mimktoś wyjaśnić dlaczego tak jest?
Tak sobie po prostu w AvrSide przyjąłem. Skąd się to wzięło ?
Avr-gcc rozróżnia wielkość litery rozszerzenia : dla S uruchamia
preprocesor, natomiast dla s nie. Tak więc w klasycznym
rozwiązaniu S stosujemy dla plików naszego kodu asm, natomiast
s jest zarezerwowane dla plików pośrednich asm tworzonych
automatycznie przez kompilator ( w związku z tym pliki s są
w makefile przy każdej kompilacji kasowane aby zrobić miejsce dla
aktualnej nowej wersji ) . To się świetnie sprawdza w rodowitych dla
gcc systemach uniksowych, które też rozróżniają wielkość liter.
Natomiast Windows nie rozróżnia : main.S i main.s będą traktowane
jako jeden i ten sam plik. Może to prowadzić do rozmaitych
nieporozumień i pomyłek - dlatego właśnie w AvrSide zastosowałem
rozwiązanie mniej elastyczne ale jednoznaczne :
- wszystkie pliki własnego kodu asm mają rozszerzenie s
- odpowiednie uruchomienie avr-gcc dla tych plików jest wymuszone
z góry linią poleceń ( -x assembler-with-cpp ) bez zwracania uwagi na
wielkość litery rozszerzenia.

To jest jak widać kwestia zupełnie umowna. Konfliktu z zasadami makefile
nie rozważałem - AvrSide powstawało właśnie po to aby tradycyjnego
make + makefile unikać . Wszelkie zmiany są oczywiście możliwe :
zarówno w kodzie AvrSide jak i ( IMHO ) w makefilu , ale czy to jest
rzeczywiście tak niezbędnie potrzebne ?

Pozdrowienia Jurek S.

Wróć do „AVR/AVR32”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 3 gości