Можно ли повлиять на код генерируемый 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
-
- а что мешает сделать желаемую ASM вставку ? начальник , жена , религия (нужное подчеркнуть) - m16(06.07.2009 22:05)