共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 跳转至页
回复
| 有奖活动 | |
|---|---|
| 这个春节你犒赏自己什么了?分享你的故事,有奖征集 | |
| 2026年“我要开发板活动”第三季,开始了! | |
| 硬核工程师专属补给计划——填盲盒 | |
| “我踩过的那些坑”主题活动——第002期 | |
| 【EEPW电子工程师创研计划】技术变现通道已开启~ | |
| 发原创文章 【每月瓜分千元赏金 凭实力攒钱买好礼~】 | |
| 【EEPW在线】E起听工程师的声音! | |
| 高校联络员开始招募啦!有惊喜!! | |
我要赚赏金打赏帖 |
|
|---|---|
| 【S32K3XX】HSE 密钥管理被打赏¥17元 | |
| 【S32K3XX】Standby RAM的初始化流程被打赏¥18元 | |
| Gravity:中英文语音合成模块V2.0及其串口控制被打赏¥24元 | |
| 全彩色度变化图的绘制被打赏¥27元 | |
| 【FreeRtos】FreeRtos任务栈的生长方向管理方式被打赏¥20元 | |
| 【瑞萨RA8D1 LVGL/LWIP评测】LVGL添加输入设备:EC11旋转编码器被打赏¥39元 | |
| 【瑞萨RA8D1 LVGL/LWIP评测】RA8D1部署FreeRTOS+LVGL被打赏¥33元 | |
| 空气质量检测器设计与实现被打赏¥24元 | |
| 【瑞萨RA8D1 LVGL/LWIP评测】LWIP进行UDP、TCP、HTTP、MQTT功能联合测试被打赏¥41元 | |
| 【瑞萨RA8D1 LVGL/LWIP评测】RA8D1部署FreeRTOS+LWIP被打赏¥36元 | |
我要赚赏金
