- posted
19 years ago
WINAVR GCC pomoc
- Vote on answer
- posted
19 years ago
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
- Vote on answer
- posted
19 years ago
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
- Vote on answer
- posted
19 years ago