|
Перенос кода из под ИАРа на WinAVR, возникают некоторые вопросы... |
|
|
|
 |
Ответов
|
Nov 30 2008, 10:23
|

Любитель
    
Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695

|
Неважнецки получается у GCC работа со структурой в нижеприведённой функции. Обработчик прерывания usart: Код typedef unsigned char byte;
struct usart_rx_status { byte counter; byte mode; volatile bool data_available; bool frame_err; bool ovrun_err; bool parity_err; bool length_err; bool lock_err; bool chksum_err; bool unknown_command; } statusRx;
ISR(USART_RX_vect) { static byte sign[] PROGMEM = {'S','N'}; static byte length; byte data, state;
do { state = UCSR0A; data = UDR0; if (statusRx.data_available) { statusRx.lock_err = TRUE; continue; } if (state & ((1<<FE0)|(1<<DOR0)|(1<<UPE0))) { if (state & (1<<FE0)) statusRx.frame_err = TRUE; if (state & (1<<DOR0)) statusRx.ovrun_err = TRUE; if (state & (1<<UPE0)) statusRx.parity_err = TRUE; statusRx.mode = RX_SEEK; statusRx.counter = 0; continue; } else { statusRx.frame_err = 0; statusRx.ovrun_err = 0; statusRx.parity_err = 0; statusRx.length_err = 0; statusRx.lock_err = 0; statusRx.chksum_err = 0; } switch(statusRx.mode) { case RX_SEEK: if (statusRx.counter < sizeof(sign)) { if (data == pgm_read_byte(sign[statusRx.counter])) { statusRx.counter++; } else { statusRx.counter = 0; } } else { statusRx.counter = 0; if (data >= sizeof(rx_buffer) || data == 0) { statusRx.length_err = TRUE; break; } rx_buffer[statusRx.counter++] = data; length = ++data; statusRx.mode = RX_RUNNING; } break; case RX_RUNNING: rx_buffer[statusRx.counter++] = data; length--; if (!length) { statusRx.data_available = TRUE; statusRx.mode = RX_SEEK; statusRx.counter = 0; } break; }
}while(UCSR0A & (1<<RXC0)); } Вот результат: Код ISR(USART_RX_vect) b10: 1f 92 push r1 b12: 0f 92 push r0 b14: 0f b6 in r0, 0x3f; 63 b16: 0f 92 push r0 b18: 11 24 eor r1, r1 b1a: 0f 93 push r16 b1c: 1f 93 push r17 b1e: 2f 93 push r18 b20: 3f 93 push r19 b22: 4f 93 push r20 b24: 5f 93 push r21 b26: 6f 93 push r22 b28: 7f 93 push r23 b2a: 8f 93 push r24 b2c: 9f 93 push r25 b2e: af 93 push r26 b30: bf 93 push r27 b32: ef 93 push r30 b34: ff 93 push r31 b36: 00 91 8d 01 lds r16, 0x018D b3a: b0 91 9b 01 lds r27, 0x019B b3e: f0 91 99 01 lds r31, 0x0199 b42: e0 91 98 01 lds r30, 0x0198 b46: 70 91 97 01 lds r23, 0x0197 b4a: 60 91 96 01 lds r22, 0x0196 b4e: 50 91 93 01 lds r21, 0x0193 b52: 10 91 94 01 lds r17, 0x0194 b56: 40 91 9a 01 lds r20, 0x019A // errorRx.allbits = 0; byte data, state;
do { state = UCSR0A; b5a: 90 91 c0 00 lds r25, 0x00C0 data = UDR0; b5e: a0 91 c6 00 lds r26, 0x00C6 if (statusRx.data_available) b62: 80 91 95 01 lds r24, 0x0195 b66: 88 23 and r24, r24 b68: 11 f0 breq .+4; 0xb6e <__vector_18+0x5e> b6a: 41 e0 ldi r20, 0x01; 1 b6c: 54 c0 rjmp .+168; 0xc16 <__vector_18+0x106> { statusRx.lock_err = TRUE; continue; } if (state & ((1<<FE0)|(1<<DOR0)|(1<<UPE0))) b6e: 29 2f mov r18, r25 b70: 30 e0 ldi r19, 0x00; 0 b72: c9 01 movw r24, r18 b74: 8c 71 andi r24, 0x1C; 28 b76: 90 70 andi r25, 0x00; 0 b78: 89 2b or r24, r25 b7a: 49 f0 breq .+18; 0xb8e <__vector_18+0x7e> { if (state & (1<<FE0)) statusRx.frame_err = TRUE; b7c: 24 fd sbrc r18, 4 b7e: 61 e0 ldi r22, 0x01; 1 if (state & (1<<DOR0)) statusRx.ovrun_err = TRUE; b80: 23 fd sbrc r18, 3 b82: 71 e0 ldi r23, 0x01; 1 if (state & (1<<UPE0)) statusRx.parity_err = TRUE; b84: 22 fd sbrc r18, 2 b86: e1 e0 ldi r30, 0x01; 1 b88: 50 e0 ldi r21, 0x00; 0 b8a: 10 e0 ldi r17, 0x00; 0 b8c: 44 c0 rjmp .+136; 0xc16 <__vector_18+0x106> statusRx.length_err = 0; statusRx.lock_err = 0; statusRx.chksum_err = 0; } // lcdPrintByte(data, 0, 0); switch(statusRx.mode) b8e: 11 23 and r17, r17 b90: 19 f0 breq .+6; 0xb98 <__vector_18+0x88> b92: 11 30 cpi r17, 0x01; 1 b94: d1 f5 brne .+116; 0xc0a <__vector_18+0xfa> b96: 27 c0 rjmp .+78; 0xbe6 <__vector_18+0xd6> { case RX_SEEK: if (statusRx.counter < sizeof(sign)) b98: 52 30 cpi r21, 0x02; 2 b9a: 70 f4 brcc .+28; 0xbb8 <__vector_18+0xa8> { if (data == pgm_read_byte(sign[statusRx.counter])) b9c: e5 2f mov r30, r21 b9e: f0 e0 ldi r31, 0x00; 0 ba0: ec 5c subi r30, 0xCC; 204 ba2: ff 4f sbci r31, 0xFF; 255 ba4: e0 81 ld r30, Z ba6: f0 e0 ldi r31, 0x00; 0 ba8: e4 91 lpm r30, Z+ baa: ae 17 cp r26, r30 bac: 19 f0 breq .+6; 0xbb4 <__vector_18+0xa4> bae: b0 e0 ldi r27, 0x00; 0 bb0: f0 e0 ldi r31, 0x00; 0 bb2: 08 c0 rjmp .+16; 0xbc4 <__vector_18+0xb4> { statusRx.counter++; bb4: 5f 5f subi r21, 0xFF; 255 bb6: 29 c0 rjmp .+82; 0xc0a <__vector_18+0xfa> } } else { statusRx.counter = 0; if (data >= sizeof(rx_buffer) || data == 0) bb8: 8a 2f mov r24, r26 bba: 81 50 subi r24, 0x01; 1 bbc: 8f 31 cpi r24, 0x1F; 31 bbe: 38 f0 brcs .+14; 0xbce <__vector_18+0xbe> bc0: b0 e0 ldi r27, 0x00; 0 bc2: f1 e0 ldi r31, 0x01; 1 bc4: e0 e0 ldi r30, 0x00; 0 bc6: 70 e0 ldi r23, 0x00; 0 bc8: 60 e0 ldi r22, 0x00; 0 bca: 50 e0 ldi r21, 0x00; 0 bcc: 23 c0 rjmp .+70; 0xc14 <__vector_18+0x104> { statusRx.length_err = TRUE; break; } rx_buffer[statusRx.counter++] = data; bce: a0 93 a1 01 sts 0x01A1, r26 length = ++data; bd2: 0a 2f mov r16, r26 bd4: 0f 5f subi r16, 0xFF; 255 bd6: b0 e0 ldi r27, 0x00; 0 bd8: f0 e0 ldi r31, 0x00; 0 bda: e0 e0 ldi r30, 0x00; 0 bdc: 70 e0 ldi r23, 0x00; 0 bde: 60 e0 ldi r22, 0x00; 0 be0: 51 e0 ldi r21, 0x01; 1 be2: 11 e0 ldi r17, 0x01; 1 be4: 17 c0 rjmp .+46; 0xc14 <__vector_18+0x104> // lcdPrintByte(data, 0, 1); statusRx.mode = RX_RUNNING; } break; case RX_RUNNING: rx_buffer[statusRx.counter++] = data; be6: e5 2f mov r30, r21 be8: f0 e0 ldi r31, 0x00; 0 bea: ef 55 subi r30, 0x5F; 95 bec: fe 4f sbci r31, 0xFE; 254 bee: a0 83 st Z, r26 bf0: 5f 5f subi r21, 0xFF; 255 length--; bf2: 01 50 subi r16, 0x01; 1 if (!length) bf4: 51 f4 brne .+20; 0xc0a <__vector_18+0xfa> { statusRx.data_available = TRUE; bf6: 10 93 95 01 sts 0x0195, r17 bfa: b0 e0 ldi r27, 0x00; 0 bfc: f0 e0 ldi r31, 0x00; 0 bfe: e0 e0 ldi r30, 0x00; 0 c00: 70 e0 ldi r23, 0x00; 0 c02: 60 e0 ldi r22, 0x00; 0 c04: 50 e0 ldi r21, 0x00; 0 c06: 10 e0 ldi r17, 0x00; 0 c08: 05 c0 rjmp .+10; 0xc14 <__vector_18+0x104> c0a: b0 e0 ldi r27, 0x00; 0 c0c: f0 e0 ldi r31, 0x00; 0 c0e: e0 e0 ldi r30, 0x00; 0 c10: 70 e0 ldi r23, 0x00; 0 c12: 60 e0 ldi r22, 0x00; 0 c14: 40 e0 ldi r20, 0x00; 0 // statusRx.mode = RX_SEEK; // statusRx.data_available = 0; // errorRx.allbits = 0; byte data, state;
do c16: 80 91 c0 00 lds r24, 0x00C0 c1a: 87 fd sbrc r24, 7 c1c: 9e cf rjmp .-196; 0xb5a <__vector_18+0x4a> c1e: 00 93 8d 01 sts 0x018D, r16 c22: b0 93 9b 01 sts 0x019B, r27 c26: f0 93 99 01 sts 0x0199, r31 c2a: e0 93 98 01 sts 0x0198, r30 c2e: 70 93 97 01 sts 0x0197, r23 c32: 60 93 96 01 sts 0x0196, r22 c36: 50 93 93 01 sts 0x0193, r21 c3a: 10 93 94 01 sts 0x0194, r17 c3e: 40 93 9a 01 sts 0x019A, r20 } break; }
}while(UCSR0A & (1<<RXC0)); } c42: ff 91 pop r31 c44: ef 91 pop r30 c46: bf 91 pop r27 c48: af 91 pop r26 c4a: 9f 91 pop r25 c4c: 8f 91 pop r24 c4e: 7f 91 pop r23 c50: 6f 91 pop r22 c52: 5f 91 pop r21 c54: 4f 91 pop r20 c56: 3f 91 pop r19 c58: 2f 91 pop r18 c5a: 1f 91 pop r17 c5c: 0f 91 pop r16 c5e: 0f 90 pop r0 c60: 0f be out 0x3f, r0; 63 c62: 0f 90 pop r0 c64: 1f 90 pop r1 c66: 18 95 reti 344 байта. У ИАРа тот-же код занимает 278 байт...
|
|
|
|
Сообщений в этой теме
sonycman Перенос кода из под ИАРа на WinAVR Nov 22 2008, 19:39 demiurg_spb Поможет WinAVR\avr\include\util... Nov 22 2008, 20:04 sonycman Цитата(demiurg_spb @ Nov 23 2008, 00:04) ... Nov 22 2008, 21:17  ReAl Цитата(sonycman @ Nov 22 2008, 23:17) Раз... Nov 23 2008, 18:03   sonycman Цитата(ARV @ Nov 23 2008, 21:23) как прав... Nov 23 2008, 19:09    ReAl Цитата(sonycman @ Nov 23 2008, 21:09) то ... Nov 23 2008, 21:37    Сергей Борщ Цитата(sonycman @ Nov 23 2008, 21:09) то ... Nov 23 2008, 21:45   Petka Цитата(ReAl @ Nov 23 2008, 21:03) У gcc е... Nov 23 2008, 20:38    sonycman Цитата(Petka @ Nov 24 2008, 00:38) В прин... Nov 23 2008, 21:37     ReAl Цитата(sonycman @ Nov 23 2008, 23:37) А е... Nov 23 2008, 21:51    ReAl Цитата(Petka @ Nov 23 2008, 22:38) В прин... Nov 23 2008, 21:43     Petka Цитата(ReAl @ Nov 24 2008, 00:43) Это НЕ ... Nov 24 2008, 07:35 MrYuran Насколько я помню, у WinAVR имеется отличная докум... Nov 23 2008, 08:24 sonycman Цитата(MrYuran @ Nov 23 2008, 12:24) Наск... Nov 23 2008, 14:33 sonycman Цитата(MrYuran @ Nov 23 2008, 12:24) Наск... Nov 23 2008, 17:09  ARV Цитата(sonycman @ Nov 23 2008, 20:09) А м... Nov 23 2008, 17:23  alx2 Цитата(sonycman @ Nov 23 2008, 22:09) А м... Nov 23 2008, 21:54 sonycman Портировал я свою программу с IARа на GCC.
Оптимиз... Nov 24 2008, 11:05 aesok Цитата(sonycman @ Nov 24 2008, 14:05) Так... Nov 24 2008, 11:35  sonycman Цитата(aesok @ Nov 24 2008, 15:35) Добавт... Nov 24 2008, 11:57   aesok Цитата(sonycman @ Nov 24 2008, 14:57) У м... Nov 24 2008, 19:07    sonycman Цитата(ARV @ Nov 24 2008, 20:40) смутил к... Nov 24 2008, 19:26     ARV Цитата(sonycman @ Nov 24 2008, 22:26) Поп... Nov 24 2008, 20:00      sonycman Цитата(ARV @ Nov 25 2008, 00:00) Кодavr-g... Nov 24 2008, 20:23       Сергей Борщ Цитата(sonycman @ Nov 24 2008, 22:23) Вот... Nov 24 2008, 21:14        sonycman Цитата(Сергей Борщ @ Nov 25 2008, 01:14) ... Nov 24 2008, 23:36         gotty Цитата(sonycman @ Nov 25 2008, 01:36) Так... Nov 25 2008, 07:39 demiurg_spb Цитата(sonycman @ Nov 24 2008, 14:05) и в... Nov 24 2008, 11:56 alx2 Привет, sonycman!
Цитата(sonycman @ Nov 2... Nov 25 2008, 21:58  Rst7 Цитата(alx2 @ Nov 25 2008, 23:58) И зря. ... Nov 26 2008, 12:46 sonycman Интересно, почему при делении на два не всегда исп... Nov 24 2008, 14:15 MrYuran Цитата(sonycman @ Nov 24 2008, 17:15) Инт... Nov 24 2008, 14:22  sonycman Цитата(MrYuran @ Nov 24 2008, 18:22) Я об... Nov 24 2008, 14:46   demiurg_spb Цитата(sonycman @ Nov 24 2008, 17:46) Ещё... Nov 24 2008, 15:58    sonycman Цитата(demiurg_spb @ Nov 24 2008, 19:58) ... Nov 24 2008, 16:05 ARV смутил ключик --gc-sections я всегда использую -Wl... Nov 24 2008, 16:40 ARV -ff-sections заставляет компилятор размещать код к... Nov 25 2008, 05:56 sonycman Цитата(gotty @ Nov 25 2008, 11:39) Для то... Nov 25 2008, 09:41  ARV Цитата(sonycman @ Nov 25 2008, 12:41) Над... Nov 25 2008, 09:52  gotty Цитата(sonycman @ Nov 25 2008, 11:41) Лин... Nov 25 2008, 10:01   sonycman Цитата(ARV @ Nov 25 2008, 13:52) практика... Nov 25 2008, 10:42    ARV Цитата(sonycman @ Nov 25 2008, 13:42) Пон... Nov 26 2008, 07:22     aesok Цитата(ARV @ Nov 26 2008, 10:22) на сколь... Nov 26 2008, 09:39      ARV Цитата(aesok @ Nov 26 2008, 12:39) На как... Nov 26 2008, 09:50 sonycman Цитата(alx2 @ Nov 26 2008, 01:58) Привет,... Nov 26 2008, 10:17 alx2 Цитата(sonycman @ Nov 26 2008, 15:17) Сей... Nov 26 2008, 20:20  Rst7 Цитата(alx2 @ Nov 26 2008, 22:20) -2, -3
... Nov 26 2008, 20:45   alx2 Цитата(Rst7 @ Nov 27 2008, 01:45) Если уж... Nov 26 2008, 21:35    Rst7 Цитата(alx2 @ Nov 26 2008, 23:35) оно дае... Nov 26 2008, 21:56   sonycman Цитата(Rst7 @ Nov 27 2008, 00:45) Однако,... Nov 26 2008, 22:02    aesok Цитата(sonycman @ Nov 27 2008, 01:02) Но ... Nov 27 2008, 04:14     alx2 Цитата(aesok @ Nov 27 2008, 09:14) The co... Nov 27 2008, 11:50    Rst7 Цитата(sonycman @ Nov 27 2008, 00:02) А д... Nov 27 2008, 07:56     gotty Цитата(Rst7 @ Nov 27 2008, 09:56) Аналоги... Nov 27 2008, 08:51      Rst7 Цитата(gotty @ Nov 27 2008, 10:51) Это на... Nov 27 2008, 09:08       gotty Цитата(Rst7 @ Nov 27 2008, 11:08) Ссылку.... Nov 27 2008, 09:24      sonycman Цитата(gotty @ Nov 27 2008, 12:51) Это на... Nov 27 2008, 09:28       zltigo Цитата(sonycman @ Nov 27 2008, 12:28) Но ... Nov 27 2008, 09:45        sonycman Цитата(zltigo @ Nov 27 2008, 13:45) Следо... Nov 27 2008, 10:04         Сергей Борщ Цитата(sonycman @ Nov 27 2008, 12:04) Пон... Nov 27 2008, 11:35     aesok Цитата(Rst7 @ Nov 27 2008, 10:56) вычисля... Nov 27 2008, 16:52      Rst7 Цитата(aesok @ Nov 27 2008, 18:52) Расмот... Nov 27 2008, 17:08    alx2 Цитата(sonycman @ Nov 27 2008, 03:02) Код... Nov 27 2008, 11:29     sonycman Цитата(alx2 @ Nov 27 2008, 15:29) Как ты ... Nov 27 2008, 13:35 sonycman 2aesok
Если у меня в программе операнд имеет тип c... Nov 27 2008, 17:03 aesok Цитата(sonycman @ Nov 27 2008, 20:03) 2ae... Nov 27 2008, 17:18  sonycman Цитата(aesok @ Nov 27 2008, 21:18) Я вам ... Nov 27 2008, 18:22   aesok ЦитатаЭтот пример не имеет ничего общего с моим пр... Nov 27 2008, 19:49    sonycman Цитата(aesok @ Nov 27 2008, 23:49) Это Ва... Nov 27 2008, 21:52     aesok Цитата(sonycman @ Nov 28 2008, 00:52) Нет... Nov 27 2008, 22:22      sonycman Цитата(aesok @ Nov 28 2008, 02:22) Я попы... Nov 27 2008, 22:46       aesok Цитата(sonycman @ Nov 28 2008, 01:46) Хм.... Nov 27 2008, 23:20        sonycman Цитата(aesok @ Nov 28 2008, 03:20) Потому... Nov 28 2008, 00:34     alx2 Цитата(sonycman @ Nov 28 2008, 02:52) Код... Nov 29 2008, 11:51      sonycman Цитата(alx2 @ Nov 29 2008, 15:51) Поэтому... Nov 29 2008, 21:02       aesok Цитата(sonycman @ Nov 30 2008, 00:02) Я п... Nov 29 2008, 22:00        sonycman Цитата(aesok @ Nov 30 2008, 02:00) Не заб... Nov 29 2008, 22:24         alx2 Цитата(sonycman @ Nov 30 2008, 03:24) А в... Nov 30 2008, 14:40        Rst7 Цитата(aesok @ Nov 30 2008, 00:00) меня н... Nov 29 2008, 22:24         aesok Цитата(Rst7 @ Nov 30 2008, 01:24) Простит... Nov 29 2008, 22:36       alx2 Цитата(sonycman @ Nov 30 2008, 02:02) Зач... Nov 30 2008, 13:41        sonycman Цитата(Rst7 @ Nov 30 2008, 17:46) Жесть. ... Nov 30 2008, 14:19 Сергей Борщ Цитата(sonycman @ Nov 28 2008, 02:34) То ... Nov 28 2008, 01:08 Rst7 ЦитатаВо-вторых, я подозреваю, что вероятность вых... Nov 29 2008, 12:53 AHTOXA Цитата(Rst7 @ Nov 29 2008, 17:53) А значи... Nov 29 2008, 19:31  Rst7 Цитата(AHTOXA @ Nov 29 2008, 21:31) Но ве... Nov 29 2008, 21:43   sonycman Цитата(Rst7 @ Nov 30 2008, 01:43) С друго... Nov 29 2008, 21:56    Rst7 Цитата(sonycman @ Nov 29 2008, 23:56) Там... Nov 29 2008, 22:53     sonycman Цитата(Rst7 @ Nov 30 2008, 02:53) Дык где... Nov 29 2008, 23:14      alx2 Цитата(sonycman @ Nov 30 2008, 04:14) В И... Nov 30 2008, 14:21       sonycman Цитата(alx2 @ Nov 30 2008, 18:21) Можно в... Nov 30 2008, 14:34     aesok Цитата(Rst7 @ Nov 30 2008, 01:53) Вынужде... Nov 29 2008, 23:31    alx2 Цитата(sonycman @ Nov 30 2008, 02:56) Име... Nov 30 2008, 13:57   AHTOXA Цитата(Rst7 @ Nov 30 2008, 02:43) Плохо В... Nov 29 2008, 23:23 alx2 Привет, Rst7!
Цитата(Rst7 @ Nov 29 2008, ... Nov 30 2008, 13:13 Rst7 Хоть я и откланялся, но господину sonycman'у о... Nov 30 2008, 11:09 sonycman Цитата(Rst7 @ Nov 30 2008, 15:09) 218 byt... Nov 30 2008, 11:57 sonycman RST7
Не получается у меня научить гнуса правильно ... Nov 30 2008, 13:22 Rst7 Цитатаи результат компиляции первой строчки:
Жест... Nov 30 2008, 13:46
2 страниц
1 2 >
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|