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

Йа моск ;)
     
Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610

|
Хоть я и откланялся, но господину sonycman'у отвечу, потому как тема имеет тенденцию сдвигаться в немного другую область, нежели IAR vs GCC. Цитата Неважнецки получается у GCC работа со структурой в нижеприведённой функции. Вообщем-то философия оптимизации данной функции гнусем понятна - загрузить в регистры все что можно и на выходе выгрузить. Подход правильный, основанный на общей идеологии RISC и Load-Store. Но в данном случае он немного не оправдывает себя. IAR подходит к проблеме утилизации Load-Store с более сдержанных позиций, он выполняет эти операции в более локальной окрестности действий с полями структуры. С другой стороны, это позволяет кодеру помочь компилятору в ручном указании, какие переменные стоит загрузить в самом начале (и сохранить в самом конце), какие - нет. Я пришел к следующей эмпирической оценке - оцениваю количество обращений к переменной. Если их больше 3, то имеет смысл переносить переменную в регистр. Причем, чем больше обращений (с учетом циклов), тем выше приоритет переменной на перенос в регистр. Ну и не забывать, что операция a=b++ - суть 2 обращения, а иногда и 3. Можно ли так подсказать гнусю - я затрудняюсь ответить, необходимо проверять. Кроме того, я бы флаги ошибок собрал бы в битовой структуре. Так проще. В результате, получился бы примерно следующий код (IAR) Код typedef struct { byte frame_err:1,ovrun_err:1,parity_err:1,length_err:1,lock_err:1,chksum_err:1,unknown_command:1; } USART_ERRORS;
struct usart_rx_status { byte counter; byte mode; volatile byte data_available; USART_ERRORS err; } statusRx;
#pragma vector=USART_RX_vect __interrupt void ISR_USART_RX(void) { static __flash byte sign[] = {'S','N'}; static byte save_length; byte data, state; USART_ERRORS err=statusRx.err; byte length=save_length; byte counter=statusRx.counter; do { state = UCSR0A; data = UDR0; if (statusRx.data_available) { err.lock_err = TRUE; continue; } if (state & ((1<<FE0)|(1<<DOR0)|(1<<UPE0))) { if (state & (1<<FE0)) err.frame_err = TRUE; if (state & (1<<DOR0)) err.ovrun_err = TRUE; if (state & (1<<UPE0)) err.parity_err = TRUE; statusRx.mode = RX_SEEK; counter = 0; continue; } else { err.frame_err = 0; err.ovrun_err = 0; err.parity_err = 0; err.length_err = 0; err.lock_err = 0; err.chksum_err = 0; } switch(statusRx.mode) { case RX_SEEK: if (counter < sizeof(sign)) { if (data == sign[counter]) { counter++; } else { counter = 0; } } else { counter = 0; if (data >= sizeof(rx_buffer) || data == 0) { err.length_err = TRUE; break; } rx_buffer[counter++] = data; length = ++data; statusRx.mode = RX_RUNNING; } break; case RX_RUNNING: rx_buffer[counter++] = data; length--; if (!length) { statusRx.data_available = TRUE; statusRx.mode = RX_SEEK; counter = 0; } break; } }while(UCSR0A & (1<<RXC0)); save_length=length; statusRx.err=err; statusRx.counter=counter; } и результат Код // 27 __interrupt void ISR_USART_RX(void) ISR_USART_RX: // 28 { ST -Y, R27 ST -Y, R26 ST -Y, R31 ST -Y, R30 ST -Y, R22 ST -Y, R21 ST -Y, R20 ST -Y, R19 ST -Y, R18 ST -Y, R17 ST -Y, R16 IN R22, 0x3F // 29 static __flash byte sign[] = {'S','N'}; // 30 static byte save_length; // 31 byte data, state; // 32 USART_ERRORS err=statusRx.err; LDI R26, LOW(statusRx) LDI R27, (statusRx) >> 8 MOVW R31:R30, R27:R26 LDD R16, Z+3 // 33 byte length=save_length; LDD R19, Z+4 // 34 byte counter=statusRx.counter; LD R18, X // 35 // 36 do // 37 { // 38 state = UCSR0A; ??ISR_USART_RX_0: LDS R21, 192 // 39 data = UDR0; LDS R17, 198 // 40 if (statusRx.data_available) MOVW R31:R30, R27:R26 LDD R20, Z+2 TST R20 BREQ ??ISR_USART_RX_1 // 41 { // 42 err.lock_err = TRUE; ORI R16, 0x10 // 43 continue; RJMP ??ISR_USART_RX_2 // 44 } // 45 if (state & ((1<<FE0)|(1<<DOR0)|(1<<UPE0))) ??ISR_USART_RX_1: MOV R20, R21 ANDI R20, 0x1C BREQ ??ISR_USART_RX_3 // 46 { // 47 if (state & (1<<FE0)) err.frame_err = TRUE; BST R21, 4 BRTC ??ISR_USART_RX_4 ORI R16, 0x01 // 48 if (state & (1<<DOR0)) err.ovrun_err = TRUE; ??ISR_USART_RX_4: BST R21, 3 BRTC ??ISR_USART_RX_5 ORI R16, 0x02 // 49 if (state & (1<<UPE0)) err.parity_err = TRUE; ??ISR_USART_RX_5: BST R21, 2 BRTC ??ISR_USART_RX_6 ORI R16, 0x04 // 50 statusRx.mode = RX_SEEK; RJMP ??ISR_USART_RX_6 // 51 counter = 0; // 52 continue; // 53 } // 54 else // 55 { // 56 err.frame_err = 0; // 57 err.ovrun_err = 0; // 58 err.parity_err = 0; // 59 err.length_err = 0; // 60 err.lock_err = 0; // 61 err.chksum_err = 0; ??ISR_USART_RX_3: ANDI R16, 0xC0 // 62 } // 63 switch(statusRx.mode) LDD R20, Z+1 SUBI R20, 0 BREQ ??ISR_USART_RX_7 DEC R20 BREQ ??ISR_USART_RX_8 RJMP ??ISR_USART_RX_2 // 64 { // 65 case RX_SEEK: // 66 if (counter < sizeof(sign)) ??ISR_USART_RX_7: CPI R18, 2 BRCC ??ISR_USART_RX_9 // 67 { // 68 if (data == sign[counter]) LDI R31, 0 MOV R30, R18 SUBI R30, LOW((-(??sign) & 0xFFFF)) SBCI R31, (-(??sign) & 0xFFFF) >> 8 LPM R20, Z CP R17, R20 BRNE ??ISR_USART_RX_10 // 69 { // 70 counter++; INC R18 RJMP ??ISR_USART_RX_2 // 71 } // 72 else // 73 { // 74 counter = 0; // 75 } // 76 } // 77 else // 78 { // 79 counter = 0; ??ISR_USART_RX_9: LDI R18, 0 // 80 if (data >= sizeof(rx_buffer) || data == 0) CPI R17, 100 BRCC ??ISR_USART_RX_11 TST R17 BRNE ??ISR_USART_RX_12 // 81 { // 82 err.length_err = TRUE; ??ISR_USART_RX_11: ORI R16, 0x08 // 83 break; RJMP ??ISR_USART_RX_2 // 84 } // 85 rx_buffer[counter++] = data; ??ISR_USART_RX_12: STS rx_buffer, R17 LDI R18, 1 // 86 length = ++data; MOV R19, R17 INC R19 // 87 statusRx.mode = RX_RUNNING; STD Z+1, R18 RJMP ??ISR_USART_RX_2 // 88 } // 89 break; // 90 case RX_RUNNING: // 91 rx_buffer[counter++] = data; ??ISR_USART_RX_8: LDI R31, 0 MOV R30, R18 SUBI R30, LOW((-(rx_buffer) & 0xFFFF)) SBCI R31, (-(rx_buffer) & 0xFFFF) >> 8 ST Z, R17 INC R18 // 92 length--; DEC R19 // 93 if (!length) TST R19 BRNE ??ISR_USART_RX_2 // 94 { // 95 statusRx.data_available = TRUE; LDI R17, 1 MOVW R31:R30, R27:R26 STD Z+2, R17 // 96 statusRx.mode = RX_SEEK; ??ISR_USART_RX_6: LDI R17, 0 STD Z+1, R17 // 97 counter = 0; ??ISR_USART_RX_10: LDI R18, 0 // 98 } // 99 break; // 100 } // 101 // 102 }while(UCSR0A & (1<<RXC0)); ??ISR_USART_RX_2: LDS R17, 192 SBRC R17, 7 RJMP ??ISR_USART_RX_0 // 103 save_length=length; MOVW R31:R30, R27:R26 STD Z+4, R19 // 104 statusRx.err=err; STD Z+3, R16 // 105 statusRx.counter=counter; ST X, R18 // 106 } OUT 0x3F, R22 LD R16, Y+ LD R17, Y+ LD R18, Y+ LD R19, Y+ LD R20, Y+ LD R21, Y+ LD R22, Y+ LD R30, Y+ LD R31, Y+ LD R26, Y+ LD R27, Y+ RETI
.... // 218 bytes in segment CODE Попробуйте сделать аналогичный финт с гнусем, посмотрим, как он себя поведет.
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
Сообщений в этой теме
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 sonycman Неважнецки получается у GCC работа со структурой в... Nov 30 2008, 10:23 sonycman RST7
Не получается у меня научить гнуса правильно ... Nov 30 2008, 13:22 Rst7 Цитатаи результат компиляции первой строчки:
Жест... Nov 30 2008, 13:46
2 страниц
1 2 >
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|