WINAVR GCC pomoc

Jan 10, 2005 3 Replies

Gdyby ktos wiedzial i potrafil pomocbylbym wdzieczny. Maj±c kawalek kodu: //deklaracje na pocz±tku volatile uint64_t we[12]; //pierwotnie zliczane impulsy wejsciowe uint8_t ONE=1 //by nakarmic kompilator



i potem w procedurze przerwania: asm volatile( "add %A0,%2" "\n\t" "adc %B0,__zero_reg__" "\n\t" "adc %C0,__zero_reg__" "\n\t" "adc %D0,__zero_reg__" "\n\t" "adc %e0,__zero_reg__" "\n\t" "adc %f0,__zero_reg__" "\n\t" "adc %g0,__zero_reg__" "\n\t" "adc %h0,__zero_reg__" "\n\t" :"=d"(we[1]) :"d"(we[1]), "d"( ONE ) ); // to jest we[0]++;



I wszystko jest pieknie tylko moim zamyslem bylo dodanie do liczby 8 bajtowej wartosci 1 a gdy zobaczymy na to asembler wyglada on tak:



//odczyt zmiennej lds r18, 0x0084 lds r19, 0x0085 lds r20, 0x0086 lds r21, 0x0087 lds r22, 0x0088 lds r23, 0x0089 lds r24, 0x008A lds r25, 0x008B lds r30, 0x006C //sumowanie add r18, r30 adc r19, r1 adc r20, r1 adc r21, r1 adc r18, r1 //problem adc r18, r1 adc r18, r1 adc r18, r1 //zapis sts 0x0084, r18 sts 0x0085, r19 sts 0x0086, r20 sts 0x0087, r21 sts 0x0088, r22 sts 0x0089, r23 sts 0x008A, r24 sts 0x008B, r25 I wszystko bylo by OK. gdyby nie to ze zamiast rejestrow r22-r25 dla wyzszej czesci liczby wsadza mi tam r18. Czy jest jaki¶ sposob na rozwiazanie tego problemu ?



pozdrawiam Michal Machowski


Witam. Miałem kiedyś podobny problem , a ponieważ nie jestem znawcą C to poszedłem najkrótszą drogą (jaka znałem) do celu i wyszło mi cos takiego: #include <avr/io.h>

#include <avr/signal.h>

volatile uint64_t we[12]; //pierwotnie zliczane impulsy wejsciowe volatile uint8_t ONE=1; //by nakarmic kompilator

SIGNAL (SIG_OVERFLOW1) {

asm volatile ( "add r16,%2" "\n\t" "adc r17,__zero_reg__" "\n\t" "adc r18,__zero_reg__" "\n\t" "adc r19,__zero_reg__" "\n\t" "adc r20,__zero_reg__" "\n\t" "adc r21,__zero_reg__" "\n\t" "adc r22,__zero_reg__" "\n\t" "adc r23,__zero_reg__" "\n\t" :"=a"(we[0]) :"a"(we[0]), "r"( ONE ) ); // to jest we[0]++; } .. Efekt kompilacji to: .. asm volatile aa: 00 91 62 00 lds r16, 0x0062 ae: 10 91 63 00 lds r17, 0x0063 b2: 20 91 64 00 lds r18, 0x0064 b6: 30 91 65 00 lds r19, 0x0065 ba: 40 91 66 00 lds r20, 0x0066 be: 50 91 67 00 lds r21, 0x0067 c2: 60 91 68 00 lds r22, 0x0068 c6: 70 91 69 00 lds r23, 0x0069 ca: 80 91 60 00 lds r24, 0x0060 ce: 08 0f add r16, r24 d0: 11 1d adc r17, r1 d2: 21 1d adc r18, r1 d4: 31 1d adc r19, r1 d6: 41 1d adc r20, r1 d8: 51 1d adc r21, r1 da: 61 1d adc r22, r1 dc: 71 1d adc r23, r1 de: 00 93 62 00 sts 0x0062, r16 e2: 10 93 63 00 sts 0x0063, r17 e6: 20 93 64 00 sts 0x0064, r18 ea: 30 93 65 00 sts 0x0065, r19 ee: 40 93 66 00 sts 0x0066, r20 f2: 50 93 67 00 sts 0x0067, r21 f6: 60 93 68 00 sts 0x0068, r22 fa: 70 93 69 00 sts 0x0069, r23 .. Nie wiem czy Ci się nada , ale lepsze to niz nic ;)

Pozdrawiam Piotrek

Tu jest problem: tylko litery A...D w ten sposób działają - jak pewnie by powiedział Bill G., 32 bity wystarczą dla wszystkich :)

Dałoby się dorobić też obsługę E...H - gcc/config/avr/avr.c na samym początku funkcji print_operand. Jednak dorobienie pełnej obsługi typów

64-bitowych na AVR (tak, by po prostu można było zwiększyć zmienną o 1 operatorem ++ i kod wyszedł optymalny) to znacznie trudniejsza sprawa.

Marek

Witam. Dziekuje wszystkim za pomoc. Mysle ¿e mi metoda reczna wystarczy, nie czuje sie na silach by grzebac w konfiguracji winavr :-). pozdrawiam. Michal Machowski

Join the Discussion

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

Didn't find your answer?

Ask the community — no account required