AVR gcc - pytanie

Witam, czy da się jakoś zapisać kod w C, aby otrzymać liczbę dwubajtową unsigned short z dwóch liczb unsigned char tak, aby kompilator wygenerował jak najmniej kodu. Np: unsigned short wValue; unsigned char byValue1, byValue2; wValue = (byValue1<<8) | byValue2; albo wValue = (byValue1<<8) + byValue2;

promują byValue1 oraz byValue2 do liczby unsigned short potem je ORują ze sobą, a przecież wiadomo że byValue1 ma trafić na starszy bajt wValue, a byValue2 na młodszy i to wszystko.

Są jakieś makra jak np: HIBYTE(wValue) = byValue1; LOBYTE(wValue) = byValue2; dzięki którym kompilator by wpisywał wartość do odpowiedniego rejestru, albo komórki pamięci? Ja nie znalazłem, albo przegapiłem (jeśli w ogóle coś takiego istnieje). Może Ktoś z Was zna rozwiązanie. Po prostu wkurza mnie, że zawsze brakuje FLASHa, a kompilator dodatkowo generuje niepotrzebny kod, tymbardziej w takich prostych przypadkach.

Mariusz

Reply to
MariuszC
Loading thread data ...

A ile go masz że Ci ciągle brakuje ? Dostosuj AVR do swoich potrzeb :)

Reply to
Piotr Chmiel

Nie używam co prawda AVRów, ale na taki sam problem pod gcc na procesory dsPIC Microchipa, oraz pod mcc18 na PIC18 rozwiązałem w sposób następujący:

/* * Use when assigning to unsigned 8-bit variable * (x is a 16 bit variable) */ #define HIGH_BYTE(x) (*(unsigned char*)((unsigned char*)(&x)+1)) #define LOW_BYTE(x) (*(unsigned char*)((unsigned char*)(&x)))

Paskudne to to jest, wiem.

hth,

Reply to
Andrzej Ekiert
Reply to
Marek Dzwonnik

Paskudne. Bo sie okaze na innym procku [np AVR] zmienna jest w jednym z [np 32] rejestrow i nie ma adresu :-)

Chyba lepiej to pierwsze i zdac sie na optymalizator.

J.

Reply to
J.F.

Użytkownik J.F. napisał: [...]

Nie, po użyciu czegoś takiego już nie będzie w rejestrze i będzie miała adres.

Jak ktoś jest tak oszczędny to jednak proponowałbym asembler

Albert

Reply to
Albert Bartoszko

Też to ćwiczyłem i jest znacznie lepiej, jednak np po przeniesieniu części kodu na 51 trzeba będzie pamiętać że one chyba (dawno nic w nich nie robiłem) mają odwrotny zapis MSB,LSB, a nie jak w AVR LSB,MSB

Mariusz

Reply to
MariuszC

Tue, 09 Nov 2004 10:04:38 +0100, na pl.misc.elektronika, MariuszC napisał(a):

Cześć.

memcpy((char*)&word,(char*)&chr2,1); 64: 00 91 62 00 lds r16, 0x0062 68: 00 93 74 00 sts 0x0074, r16 memcpy((char*)&word+1,(char*)&chr1,1); 6c: 10 91 63 00 lds r17, 0x0063 70: 10 93 75 00 sts 0x0075, r17

Reply to
Jurek Szczesiul

Eeeee .. czy on ma prawo tak robic ? powinien wywolac funkcje biblioteczna memcpy.

J.

Reply to
J.F.

I to jest dopiero optymalizacja! ;-)

Pozdrawiam

Marcin Stanisz

Reply to
Marcin Stanisz

Ma prawo. GCC (na kazda architekture, niekoniecznie AVR) ma troche funkcji wbudowanych - zamiast wywolania funkcji moze wygenerowac kawalek kodu, robiacy to samo tylko bardziej efektywnie. Mozna uzyc -fno-builtin (lub dla konkretnej funkcji: -fno-builtin-memcpy) by te optymalizacje wylaczyc.

Wstawienie kawalka kodu ma te przewage nad wywolaniem funkcji, ze nie "zapomina" sie tylu rejestrow (AVR: r18-r27 i r30-r31), wiec moze sie oplacac nawet dla funkcji nieco wiekszych niz memcpy().

Marek

Reply to
Marek Michalkiewicz

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.