今天看到一贴对GCC-AVR的评价,竟然写出放弃GCC-AVR的主贴! 俺不得不回应一下: 地球人都知道编译器对程序代码的优化不是永无止境的,代码的优化程度跟程序风格的写法有极大的关系。其实每一个合格的单片机C程序员必需了解手上C开发编译工具的性能,若连自已赖以为生的开发工具的都不能熟悉,就不配做一个程序开发人员。
俺先用硬件作过比较: ----------------------------------------------------------- 用过VHDL硬件描述语言的人都知道,逻辑寄存器的使用跟代码描述方式有关,实现相同的功能,一个有经验的硬件高手用结构描述,跟没有经验的菜鸟用行为描述,最后无论编译器优化性能如何的卓越,硬件高手用的逻辑就是比菜鸟用得少很多! ----------------------------------------------------------- 再用软件作个比较-----GCC-AVR编译: 对于单片机C编译器,若果实现相同的功能,同一优化级别下。 例如:对于同一条件逻辑判断,高手VS菜鸟, 高手会用: if(Uart_Byte_H==Cmd_Light_Dev) if(Uart_Byte_L!=0){ Uart_Byte_L=12; } ------------------------ 菜鸟会用: if((Uart_Byte_H==Cmd_Light_Dev) & (Uart_Byte_L!=0)){ Uart_Byte_L=12; }
//---高手的代码编译后的长度--(仅是用了8条指令)-------- if(Uart_Byte_H==Cmd_Light_Dev) 4616: 80 91 03 01 lds r24, 0x0103 461a: 83 30 cpi r24, 0x03 ; 3 461c: 39 f4 brne .+14 ; 0x462c <main+0x17e> if(Uart_Byte_L!=0){ 461e: 80 91 04 01 lds r24, 0x0104 4622: 88 23 and r24, r24 4624: 19 f0 breq .+6 ; 0x462c <main+0x17e> Uart_Byte_L=12; 4626: 8c e0 ldi r24, 0x0C ; 12 4628: 80 93 04 01 sts 0x0104, r24 } ***************************************************** //----菜鸟的代码编译后的长度---(用了28条指令)------ if((Uart_Byte_H==Cmd_Light_Dev) & (Uart_Byte_L!=0)){ 45d8: 1c 82 std Y+4, r1 ; 0x04 45da: 1b 82 std Y+3, r1 ; 0x03 45dc: 80 91 03 01 lds r24, 0x0103 45e0: 83 30 cpi r24, 0x03 ; 3 45e2: 21 f4 brne .+8 ; 0x45ec <main+0x13e> 45e4: 81 e0 ldi r24, 0x01 ; 1 45e6: 90 e0 ldi r25, 0x00 ; 0 45e8: 9c 83 std Y+4, r25 ; 0x04 45ea: 8b 83 std Y+3, r24 ; 0x03 45ec: 1e 82 std Y+6, r1 ; 0x06 45ee: 1d 82 std Y+5, r1 ; 0x05 45f0: 80 91 04 01 lds r24, 0x0104 45f4: 88 23 and r24, r24 45f6: 21 f0 breq .+8 ; 0x4600 <main+0x152> 45f8: 21 e0 ldi r18, 0x01 ; 1 45fa: 30 e0 ldi r19, 0x00 ; 0 45fc: 3e 83 std Y+6, r19 ; 0x06 45fe: 2d 83 std Y+5, r18 ; 0x05 4600: 8b 81 ldd r24, Y+3 ; 0x03 4602: 9c 81 ldd r25, Y+4 ; 0x04 4604: 2d 81 ldd r18, Y+5 ; 0x05 4606: 3e 81 ldd r19, Y+6 ; 0x06 4608: 82 23 and r24, r18 460a: 93 23 and r25, r19 460c: 00 97 sbiw r24, 0x00 ; 0 460e: 19 f0 breq .+6 ; 0x4616 <main+0x168> Uart_Byte_L=12; 4610: 8c e0 ldi r24, 0x0C ; 12 4612: 80 93 04 01 sts 0x0104, r24 } |