blackbit (11.04.2008 11:41, просмотров: 188) ответил abivan на А как он, иар компилятор для 24-го безплюсовая его часть, в сравнении с С30?
На первый взгляд, у iar'а оптимизатор умней. Простой пример для pic24F:
volatile unsigned char i,j,r;
unsigned char fun1(unsigned char v1, unsigned char v2);
unsigned char fun2(unsigned char v1, unsigned char v2);
int main( void )
{
i=1;
j=2;
r = fun1(i,j);
r += fun2(i,j);
while(1);
}
unsigned char fun1(unsigned char v1, unsigned char v2)
{
return (++v1 + --v2);
}
unsigned char fun2(unsigned char v1, unsigned char v2)
{
return (v1 + v2);
}
У обоих включена максимальная оптимизация по размеру. Кроме того, у C30 включена пре- и пост- оптимизации.
Результат по непосредственно полезному коду:
iar 1.40A : 49 слов
С30 3.02С : 117 слов
Иллюстрации сравниваемого опкода:
iar 1.40A
i=1;
main:
00000242 0010 0020 MOV #1,W0
00000244 C521 0020 MOV #0xC52,W1
00000246 4880 0078 MOV.b W0, [W1]
j=2;
00000248 0020 0020 MOV #2,W0
0000024A C531 0020 MOV #0xC53,W1
0000024C 4880 0078 MOV.b W0, [W1]
r = fun1(i,j);
0000024E 4091 0078 MOV.b [W1], W1
00000250 C520 0020 MOV #0xC52,W0
00000252 4010 0078 MOV.b [W0], W0
00000254 0270 0002
0000 0000 CALL fun1
00000258 C541 0020 MOV #0xC54,W1
0000025A 4880 0078 MOV.b W0, [W1]
r += fun2(i,j);
0000025C C530 0020 MOV #0xC53,W0
0000025E 4010 0078 MOV.b [W0], W0
00000260 C521 0020 MOV #0xC52,W1
00000262 4091 0078 MOV.b [W1], W1
00000264 4100 0078 MOV.b W0, W2
00000266 4001 0078 MOV.b W1, W0
00000268 C541 0020 MOV #0xC54,W1
0000026A 4000 0041 ADD.b W2, W0, W0
0000026C 4891 0040 ADD.b W0, [W1], [W1]
while(1);
0000026E FFFF 0037 BRA 0x26E
return (++v1 + --v2);
fun1:
00000270 C000 0040 ADD.b W1, W0, W0
00000272 0000 0006 RETURN
С30 3.02С
Line Address Opcode Disassembly
322 0282 B3C010 mov.b #0x1,0x0000
323 0284 B7E800 mov.b 0x0000,0x0800
324 0286 B3C020 mov.b #0x2,0x0000
325 0288 B7E801 mov.b 0x0000,0x0801
326 028A 208011 mov.w #0x801,0x0002
327 028C 784091 mov.b [0x0002],0x0002
328 028E BFC800 mov.b 0x0800,0x0000
329 0290 07000A rcall 0x0002a6
330 0292 B7E802 mov.b 0x0000,0x0802
331 0294 208011 mov.w #0x801,0x0002
332 0296 784091 mov.b [0x0002],0x0002
333 0298 BFC800 mov.b 0x0800,0x0000
334 029A 070011 rcall 0x0002be
335 029C 784080 mov.b 0x0000,0x0002
336 029E BFC802 mov.b 0x0802,0x0000
337 02A0 40C000 add.b 0x0002,0x0000,0x0000
338 02A2 B7E802 mov.b 0x0000,0x0802
339 02A4 37FFFF bra 0x0002a4
340 02A6 FA0002 lnk #0x2
341 02A8 784F00 mov.b 0x0000,[0x001c]
342 02AA 984711 mov.b 0x0002,[0x001c+1]
343 02AC E84F1E inc.b [0x001c],[0x001c]
344 02AE 90401E mov.b [0x001c+1],0x0000
345 02B0 E94000 dec.b 0x0000,0x0000
346 02B2 984710 mov.b 0x0000,[0x001c+1]
347 02B4 90401E mov.b [0x001c+1],0x0000
348 02B6 40401E add.b 0x0000,[0x001c],0x0000
349 02B8 FB8000 ze.b 0x0000,0x0000
350 02BA FA8000 ulnk
351 02BC 060000 return
352 02BE FA0002 lnk #0x2
353 02C0 784F00 mov.b 0x0000,[0x001c]
354 02C2 984711 mov.b 0x0002,[0x001c+1]
355 02C4 90401E mov.b [0x001c+1],0x0000
356 02C6 40401E add.b 0x0000,[0x001c],0x0000
357 02C8 FB8000 ze.b 0x0000,0x0000
358 02CA FA8000 ulnk
359 02CC 060000 return
---------------------------------------------------------
Комментарии:
1. Как видно iar додумался не делать call для fun2, влепив ее инлайн в основное тело, а С30, увы, не догнал. Причем обмануть iar в этом плане оказалось достаточно трудно - распознавал даже вложенность и всё равно делал по уму.
2. Real ICE под iar бегает действительно очень медленно. После Mplab'a работать невозможно.