ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Суббота
18 мая
160936
Андрейка (06.07.2009 21:49, просмотров: 1073)
Можно ли повлиять на код генерируемый CodeVisionAVR Кусок кода, приведенный ниже,размещен внутри процедуры, все переменные локальные (т.е. после отработки кода они не нужны и хранить их в памяти не надо). Никак не могу добиться чтобы CVAVR генерировал оптимальный код: зачем-то сохраняет переменные в память (а я их объявляю через директиву register) и почему-то абсолютно не хочет использовать команды с автоинкрементом (типа ST X+,R30). Желаемый приведен внизу. Код генерируемый CodeVisionAVR для ATxmega128A1: 170: start = (uint8*)buf_RX; 00000375: E8E0 LDI R30,0x80 00000376: E2F0 LDI R31,0x20 00000377: 87E8 STD Y+8,R30 00000378: 87F9 STD Y+9,R31 178: for (j=0; j<28; j = j + 2) 00000379: E050 LDI R21,0x00 0000037A: 315C CPI R21,0x1C 0000037B: F4A0 BRCC PC+0x15 180: *start++ = W5300.SOCK0.RX_FIFOR0; 0000037C: 85A8 LDD R26,Y+8 0000037D: 85B9 LDD R27,Y+9 0000037E: 9611 ADIW R26,0x01 0000037F: 87A8 STD Y+8,R26 00000380: 87B9 STD Y+9,R27 00000381: 9711 SBIW R26,0x01 00000382: 91E041AE LDS R30,0x41AE 00000384: 93EC ST X,R30 182: *start++ = W5300.SOCK0.RX_FIFOR1; 00000385: 85A8 LDD R26,Y+8 00000386: 85B9 LDD R27,Y+9 00000387: 9611 ADIW R26,0x01 00000388: 87A8 STD Y+8,R26 00000389: 87B9 STD Y+9,R27 0000038A: 9711 SBIW R26,0x01 0000038B: 91E041AF LDS R30,0x41AF 0000038D: 93EC ST X,R30 184: }; 0000038E: 5F5E SUBI R21,0xFE 0000038F: CFEA RJMP PC-0x0015 Желаемый код: 170: start = (uint8*)buf_RX; LDI R26,0x80 LDI R27,0x20 178: for (j=0; j<28; j = j + 2) LDI R21,0x00 CPI R21,0x1C BRCC PC+0x09 180: *start++ = W5300.SOCK0.RX_FIFOR0; LDS R30,0x41AE ST X+,R30 182: *start++ = W5300.SOCK0.RX_FIFOR1; LDS R30,0x41AF ST X+,R30 184: }; SUBI R21,0xFE RJMP PC-0x009