共3条
1/1 1 跳转至页
I2c,GCC 做I2c感受到GCC的效率啊
问
分别用GCC和ICC编译相同的一段程序,我编译的是I2c的中断程序.ICC手头上有正版,打勾了Enable Code Compression,GCC的优化参数是默认的Os.
GCC:
if (twst == TW_SR_SLA_ACK)
c4: c0 36 cpi r28, 0x60 ; 96
c6: 61 f0 breq .+24 ; 0xe0
{
TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWEA)|(1<<TWIE);
}
else if (twst == TW_SR_DATA_ACK)
c8: c0 38 cpi r28, 0x80 ; 128
ca: 51 f0 breq .+20 ; 0xe0
TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWEA)|(1<<TWIE);
}
else if (twst == TW_SR_STOP)
cc: c0 3a cpi r28, 0xA0 ; 160
ce: 41 f0 breq .+16 ; 0xe0
{
TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWEA)|(1<<TWIE);
}
else if (twst == TW_ST_SLA_ACK)
d0: c8 3a cpi r28, 0xA8 ; 168
d2: 11 f0 breq .+4 ; 0xd8
{
TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWIE);
}
else if (twst == TW_ST_DATA_ACK)
d4: c8 3b cpi r28, 0xB8 ; 184
d6: 11 f4 brne .+4 ; 0xdc
{
TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWIE);
d8: 85 e8 ldi r24, 0x85 ; 133
da: 03 c0 rjmp .+6 ; 0xe2
}
else if (twst == TW_ST_DATA_NACK)
dc: c0 3c cpi r28, 0xC0 ; 192
de: 11 f4 brne .+4 ; 0xe4
{
TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWEA)|(1<<TWIE);
e0: 85 ec ldi r24, 0xC5 ; 197
e2: 86 bf out 0x36, r24 ; 54
}
ICC:
(0039) if (tmpchr == TW_SR_SLA_ACK)
0050 3640 CPI R20,0x60
0051 F419 BNE 0x0055
(0040) {
(0041) TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWEA)|(1<<TWIE);
0052 EC85 LDI R24,0xC5
0053 BF86 OUT P36,R24
(0042) }
0054 C018 RJMP 0x006D
(0043) else if (tmpchr == TW_SR_DATA_ACK)
0055 3840 CPI R20,0x80
0056 F419 BNE 0x005A
(0044) {
(0068) TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWEA)|(1<<TWIE);
0057 EC85 LDI R24,0xC5
0058 BF86 OUT P36,R24
(0069) }
0059 C013 RJMP 0x006D
(0070) else if (tmpchr == TW_SR_STOP)
005A 3A40 CPI R20,0xA0
005B F419 BNE 0x005F
(0071) {
(0076) TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWEA)|(1<<TWIE);
005C EC85 LDI R24,0xC5
005D BF86 OUT P36,R24
(0077) }
005E C00E RJMP 0x006D
(0078) else if (tmpchr == TW_ST_SLA_ACK)
005F 3A48 CPI R20,0xA8
0060 F419 BNE 0x0064
(0079) {
(0083) TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWIE);
0061 E885 LDI R24,0x85
0062 BF86 OUT P36,R24
(0084) }
0063 C009 RJMP 0x006D
(0085) else if (tmpchr == TW_ST_DATA_ACK)
0064 3B48 CPI R20,0xB8
0065 F419 BNE 0x0069
(0086) {
(0087) TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWIE);
0066 E885 LDI R24,0x85
0067 BF86 OUT P36,R24
(0088) }
0068 C004 RJMP 0x006D
(0089) else if (tmpchr == TW_ST_DATA_NACK)
0069 3C40 CPI R20,0xC0
006A F411 BNE 0x006D
(0090) {
(0091) TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWEA)|(1<<TWIE);
006B EC85 LDI R24,0xC5
006C BF86 OUT P36,R24
(0092) }
其中省略掉了//注释掉的处理程序.
在ICC中,可能测试程序不长,看不到选与不选Enable那项有和不同,但与GCC相比教,明显的编译后的汇编程序ICC不如GCC来简单.感觉GCC比较聪敏.:) ICC的处理就象按部就班的样子,太老实!
答 1: 我试过:GCC的优化确实不错,接近汇编哦........
GCC:
if (twst == TW_SR_SLA_ACK)
c4: c0 36 cpi r28, 0x60 ; 96
c6: 61 f0 breq .+24 ; 0xe0
{
TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWEA)|(1<<TWIE);
}
else if (twst == TW_SR_DATA_ACK)
c8: c0 38 cpi r28, 0x80 ; 128
ca: 51 f0 breq .+20 ; 0xe0
TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWEA)|(1<<TWIE);
}
else if (twst == TW_SR_STOP)
cc: c0 3a cpi r28, 0xA0 ; 160
ce: 41 f0 breq .+16 ; 0xe0
{
TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWEA)|(1<<TWIE);
}
else if (twst == TW_ST_SLA_ACK)
d0: c8 3a cpi r28, 0xA8 ; 168
d2: 11 f0 breq .+4 ; 0xd8
{
TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWIE);
}
else if (twst == TW_ST_DATA_ACK)
d4: c8 3b cpi r28, 0xB8 ; 184
d6: 11 f4 brne .+4 ; 0xdc
{
TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWIE);
d8: 85 e8 ldi r24, 0x85 ; 133
da: 03 c0 rjmp .+6 ; 0xe2
}
else if (twst == TW_ST_DATA_NACK)
dc: c0 3c cpi r28, 0xC0 ; 192
de: 11 f4 brne .+4 ; 0xe4
{
TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWEA)|(1<<TWIE);
e0: 85 ec ldi r24, 0xC5 ; 197
e2: 86 bf out 0x36, r24 ; 54
}
ICC:
(0039) if (tmpchr == TW_SR_SLA_ACK)
0050 3640 CPI R20,0x60
0051 F419 BNE 0x0055
(0040) {
(0041) TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWEA)|(1<<TWIE);
0052 EC85 LDI R24,0xC5
0053 BF86 OUT P36,R24
(0042) }
0054 C018 RJMP 0x006D
(0043) else if (tmpchr == TW_SR_DATA_ACK)
0055 3840 CPI R20,0x80
0056 F419 BNE 0x005A
(0044) {
(0068) TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWEA)|(1<<TWIE);
0057 EC85 LDI R24,0xC5
0058 BF86 OUT P36,R24
(0069) }
0059 C013 RJMP 0x006D
(0070) else if (tmpchr == TW_SR_STOP)
005A 3A40 CPI R20,0xA0
005B F419 BNE 0x005F
(0071) {
(0076) TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWEA)|(1<<TWIE);
005C EC85 LDI R24,0xC5
005D BF86 OUT P36,R24
(0077) }
005E C00E RJMP 0x006D
(0078) else if (tmpchr == TW_ST_SLA_ACK)
005F 3A48 CPI R20,0xA8
0060 F419 BNE 0x0064
(0079) {
(0083) TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWIE);
0061 E885 LDI R24,0x85
0062 BF86 OUT P36,R24
(0084) }
0063 C009 RJMP 0x006D
(0085) else if (tmpchr == TW_ST_DATA_ACK)
0064 3B48 CPI R20,0xB8
0065 F419 BNE 0x0069
(0086) {
(0087) TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWIE);
0066 E885 LDI R24,0x85
0067 BF86 OUT P36,R24
(0088) }
0068 C004 RJMP 0x006D
(0089) else if (tmpchr == TW_ST_DATA_NACK)
0069 3C40 CPI R20,0xC0
006A F411 BNE 0x006D
(0090) {
(0091) TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWEA)|(1<<TWIE);
006B EC85 LDI R24,0xC5
006C BF86 OUT P36,R24
(0092) }
其中省略掉了//注释掉的处理程序.
在ICC中,可能测试程序不长,看不到选与不选Enable那项有和不同,但与GCC相比教,明显的编译后的汇编程序ICC不如GCC来简单.感觉GCC比较聪敏.:) ICC的处理就象按部就班的样子,太老实!
答 1: 我试过:GCC的优化确实不错,接近汇编哦........
共3条
1/1 1 跳转至页
回复
我要赚赏金打赏帖 |
|
|---|---|
| PCF8574功能模块及其使用被打赏¥20元 | |
| 传感器LSM6DSO及LIS3MDL的功能检测被打赏¥18元 | |
| LPS25HB气压传感器及其检测被打赏¥18元 | |
| HTS221温湿度传感器及其检测被打赏¥18元 | |
| 【S32K3XX】HSE FW 版本更新被打赏¥21元 | |
| 基于ArduinoUNO开发板的AT24C02读写测试被打赏¥16元 | |
| TCS3472S传感器及其色彩检测被打赏¥19元 | |
| 【S32DS】S32K3 RTD7.0.1 HSE 组件配置报错问题解决被打赏¥27元 | |
| 【S32K3XX】MCME 启动 CORE1被打赏¥23元 | |
| AG32VH407下温度大气压传感器及其检测被打赏¥20元 | |
我要赚赏金
