void SendData(u8 byte1,u8 byte2)
{
data u8 i;
for(i = 0;i < 8;i++)
{
COL_SCK_L;
if(byte1 & (0x80 >> i))
COL_SI_H;
else
COL_SI_L;
COL_SCK_H;
}
for(i = 0;i < 8;i++)
{
COL_SCK_L;
if(byte2 & (0x80 >> i))
COL_SI_H;
else
COL_SI_L;
COL_SCK_H;
}
COL_RCK_L;
COL_RCK_H;
}
while(1)
{
ROW_SCK_L;
ROW_SI_H;
ROW_SCK_H;
ROW_RCK_L;
ROW_RCK_H;
ROW_SI_L;
for(j=0 ; j<112 ; j++)
{
SendData(Hanzi[(j*2)+1],Hanzi[(j*2)]);
ROW_SCK_L;
ROW_SCK_H;
ROW_RCK_L;
ROW_RCK_H;
}
}
优化等级
|
for语句+移位(n位)
|
时间/us
|
|
0(speed)
|
400.50
|
1(speed)
|
400.19
|
2(speed)
|
400.50
|
3(speed)
|
338.36
|
4(speed)
|
350.27
|
5(speed)
|
350.27
|
6(speed)
|
314.79
|
7(speed)
|
313.88(size:798)
|
8(speed)
|
314.79
|
9(speed)
|
416.46(size:776)
|
9(size)
|
423.84(size:776)
|
126: for(i = 0;i < 8;i++)
C:0x0225 E4 CLR A
C:0x0226 FC MOV R4,A
127: {
128: COL_SCK_L;
129: if(byte1 & (0x80 >> i))
C:0x0227 1202DD LCALL Com0038(C:02DD)
C:0x022A 8003 SJMP C:022F
C:0x022C 1202E7 LCALL L?0060(C:02E7)
C:0x022F D8FB DJNZ R0,C:022C
C:0x0231 FF MOV R7,A
C:0x0232 E9 MOV A,R1
C:0x0233 FB MOV R3,A
C:0x0234 EF MOV A,R7
C:0x0235 5B ANL A,R3
C:0x0236 6004 JZ C:023C
130: COL_SI_H;
131: else
C:0x0238 D295 SETB P1_5(0x90.5)
C:0x023A 8002 SJMP C:023E
132: COL_SI_L;
C:0x023C C295 CLR P1_5(0x90.5)
133: COL_SCK_H;
C:0x023E D297 SETB P1_7(0x90.7)
134: }
C:0x0240 0C INC R4
C:0x0241 BC08E3 CJNE R4,#0x08,C:0227
C:0x02DD C297 CLR P1_7(0x90.7)
C:0x02DF 7480 MOV A,#P0(0x80)
C:0x02E1 7E00 MOV R6,#0x00
C:0x02E3 A804 MOV R0,0x04
C:0x02E5 08 INC R0
C:0x02E6 22 RET
C:0x02E7 CE XCH A,R6
C:0x02E8 A2E7 MOV C,0xE0.7
C:0x02EA 13 RRC A
C:0x02EB CE XCH A,R6
C:0x02EC 13 RRC A
C:0x02ED 22 RET
void SendData(u8 byte1,u8 byte2)
{
COL_SCK_L;
if(byte1 & 0x80)
COL_SI_H;
else
COL_SI_L;
COL_SCK_H;
COL_SCK_L;
if(byte1 & 0x40)
COL_SI_H;
else
COL_SI_L;
COL_SCK_H;
COL_SCK_L;
if(byte1 & 0x20)
COL_SI_H;
else
COL_SI_L;
COL_SCK_H;
COL_SCK_L;
if(byte1 & 0x10)
COL_SI_H;
else
COL_SI_L;
COL_SCK_H;
COL_SCK_L;
if(byte1 & 0x08)
COL_SI_H;
else
COL_SI_L;
COL_SCK_H;
COL_SCK_L;
if(byte1 & 0x04)
COL_SI_H;
else
COL_SI_L;
COL_SCK_H;
COL_SCK_L;
if(byte1 & 0x02)
COL_SI_H;
else
COL_SI_L;
COL_SCK_H;
COL_SCK_L;
if(byte1 & 0x01)
COL_SI_H;
else
COL_SI_L;
COL_SCK_H;
COL_SCK_L;
if(byte2 & 0x80)
COL_SI_H;
else
COL_SI_L;
COL_SCK_H;
COL_SCK_L;
if(byte2 & 0x40)
COL_SI_H;
else
COL_SI_L;
COL_SCK_H;
COL_SCK_L;
if(byte2 & 0x20)
COL_SI_H;
else
COL_SI_L;
COL_SCK_H;
COL_SCK_L;
if(byte2 & 0x10)
COL_SI_H;
else
COL_SI_L;
COL_SCK_H;
COL_SCK_L;
if(byte2 & 0x08)
COL_SI_H;
else
COL_SI_L;
COL_SCK_H;
COL_SCK_L;
if(byte2 & 0x04)
COL_SI_H;
else
COL_SI_L;
COL_SCK_H;
COL_SCK_L;
if(byte2 & 0x02)
COL_SI_H;
else
COL_SI_L;
COL_SCK_H;
COL_SCK_L;
if(byte2 & 0x01)
COL_SI_H;
else
COL_SI_L;
COL_SCK_H;
COL_RCK_L;
COL_RCK_H;
}
优化等级
|
顺序语句
|
时间/us
|
|
0(speed)
|
68.23
|
1(speed)
|
68.23
|
2(speed)
|
68.19
|
3(speed)
|
66.70
|
4(speed)
|
65.31
|
5(speed)
|
65.21
|
6(speed)
|
63.33
|
7(speed)
|
63.37
|
8(speed)
|
63.37
|
9(speed)
|
63.31(size:935)
|
9(size)
|
70.87(size:935)
|
void SendData(u8 byte1,u8 byte2)
{
data u8 i;
for(i = 0;i < 8;i++)
{
COL_SCK_L;
if(byte1 & 0x80)
COL_SI_H;
else
COL_SI_L;
COL_SCK_H;
byte1 <<= 1;
}
for(i = 0;i < 8;i++)
{
COL_SCK_L;
if(byte2 & 0x80)
COL_SI_H;
else
COL_SI_L;
COL_SCK_H;
byte2 <<= 1;
}
COL_RCK_L;
COL_RCK_H;
}
优化等级
|
For语句+移位(1位)
|
时间/us
|
|
0(speed)
|
139.25
|
1(speed)
|
139.45
|
2(speed)
|
139.25
|
3(speed)
|
137.94
|
4(speed)
|
136.59
|
5(speed)
|
136.47
|
6(speed)
|
100.75
|
7(speed)
|
100.75
|
8(speed)
|
100.79
|
9(speed)
|
100.71(size:759)
|
9(size)
|
108.15(size:759)
|
优化等级 |
for语句+移位(n位) |
顺序语句 |
For语句+移位(1位) |
时间/us |
时间/us |
时间/us |
|
0(speed) |
400.50 |
68.23 |
139.25 |
1(speed) |
400.19 |
68.23 |
139.45 |
2(speed) |
400.50 |
68.19 |
139.25 |
3(speed) |
338.36 |
66.70 |
137.94 |
4(speed) |
350.27 |
65.31 |
136.59 |
5(speed) |
350.27 |
65.21 |
136.47 |
6(speed) |
314.79 |
63.33 |
100.75 |
7(speed) |
313.88(size:798) |
63.37 |
100.75 |
8(speed) |
314.79 |
63.37 |
100.79 |
9(speed) |
416.46(size:776) |
63.31(size:935) |
100.71(size:759) |
9(size) |
423.84(size:776) |
70.87(size:935) |
108.15(size:759) |
级别 说明
0 常数合并:编译器预先计算结果,尽可能用常数代替表达式。包括运行地址计算。
优化简单访问:编译器优化访问8051系统的内部数据和位地址。
跳转优化:编译器总是扩展跳转到最终目标,多级跳转指令被删除。
1 死代码删除:没用的代码段被删除。
拒绝跳转:严密的检查条件跳转,以确定是否可以倒置测试逻辑来改进或删除。
2 数据覆盖:适合静态覆盖的数据和位段被确定,并内部标识。BL51连接/定位器可以通
过全局数据流分 ,选择可被覆盖的段。
3 窥孔优化:清除多余的MOV指令。这包括不必要的从存储区加载和常数加载操作。当存
储空间或执行时间可节省时,用简单操作代替复杂操作。
4 寄存器变量:如有可能,自动变量和函数参数分配到寄存器上。为这些变量保留的存 储区就省略了。
优化扩展访问:IDATA、XDATA、PDATA和CODE的变量直接包含在操作中。在多数时间没
必要使用中间寄存器。
局部公共子表达式删除:如果用一个表达式重复进行相同的计算,则保存第一次计算
结果,后面有可能就用这结果。多余的计算就被删除。
Case/Switch优化:包含SWITCH和CASE的代码优化为跳转表或跳转队列。
5 全局公共子表达式删除:一个函数内相同的子表达式有可能就只计算一次。中间结果
保存在寄存器中,在一个新的计算中使用。
简单循环优化:用一个常数填充存储区的循环程序被修改和优化。
6 循环优化:如果结果程序代码更快和有效则程序对循环进行优化。
7 扩展索引访问优化:适当时对寄存器变量用DPTR。对指针和数组访问进行执行速度和 代码大小优化。
8 公共尾部合并:当一个函数有多个调用,一些设置代码可以复用,因此减少程序大小 。
9 公共块子程序:检测循环指令序列,并转换成子程序。Cx51甚至重排代码以得到更大的循环序列。