avr-gcc

Jul 07, 2005 7 Replies

Witam.



Zaczynam programowanie AVRow, jako zadeklarowany linuksowiec staram sie uzywac linuksowych narzedzi, ale niestety nie wychodzi. :(



Prosty program, np. taki (test.S): #v+



#include <avr/io.h>



#define mp r16



.global main



main: ldi mp, 0xff out DDRA, mp



ldi mp, 0x03 out PORTA, mp



loop: rjmp loop #v-



Skompilowany za pomoca avr-gcc (3.4.3, z Debiana testing) po prostu nie dziala. Kiedy napisze cos podobnego w Avr Studio uruchomionym pod wine, i wczytam to za pomoca avrdude (tak samo robie z tym pod avr-gcc), wszystko jest OK.



Po prostu nie dziala, mimo takiego samego kodu (pomijajac roznice w skladni), plik wygenerowany przez gcc jest wikszy.



Kompilacja wyglada tak:



#v+ avr-gcc -I. -mmcu=attiny26 -x assembler-with-cpp \ -Wa,-gstabs,-ahlms=test.lst -c test.S -o test.o avr-gcc -Wl,-Map,led.out.map -mmcu=attiny26 -lm -o led.out test.o avr-objcopy -j .text \ -j .data \ -O ihex led.out led.hex #v-



Nie wiem, co wiecej napisac, stan portu sie nie zmiania, jakby uklad wogole nie byl zaprogramowany. Czy jest cos o czym zapomnialem?


[...]

Wrzuc na Siec pliki hex wygenerowane na oba sposoby (dzialajacy i nie dzialajacy) - zobaczymy, co w nich jest "nie tego".

Damian Pietras napisał(a):

^^^^ rejestry w plikach nagłówkowych są zadeklarowane tak, żeby móc się do nich odwoływać w kodzie C jak do komórek pamięci RAM. jeśli chcesz użyć do instrukcji in albo out, możesz albo odjąć od nich 0x20, albo użyć makra _SFR_IO_ADDR(), jeśli wolisz eleganckie rozwiązania:

ldi mp, 0xff out _SFR_IO_ADDR(DDRA), mp

w.

Z avr-gcc: #v+ :100000000BC00FC00EC00DC00CC00BC00AC009C091 :1000100008C007C006C005C011241FBECFEDCDBF6C :0E00200001C0EECF0FEF0ABF03E00BBFFDCF14 :00000001FF #v-

Z Avr Studio:

#v+ :020000020000FC :0A0000000FEF0ABB03E00BBBFFCFBC :00000001FF #v-

Apropos, da sie jakos prosto disasemblowac taki plik?

Damian Pietras napisał(a):

avr-objdump -D -b ihex -m avrX plik.hex, gdzie X to 1-5, w zależności od docelowego układu.

w.

A to wyjasnie, skad wiekszy rozmiar: avr-gcc dodaje instrukcje skoku do wszystkich przerwan, inicjuje stos i zeruje rejestr statusu.

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required