ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Понедельник
6 мая
117918 Топик полностью
blackbit (11.04.2008 11:41, просмотров: 168) ответил 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 работать невозможно.