我在嵌入式项目中使用MIPS cpu(PIC32),但我开始质疑我的选择.
我知道像MIPS这样的RISC cpu会生成比预期更多的指令,但我不认为它会是这样的.以下是反汇编列表中的代码段:
我知道像MIPS这样的RISC cpu会生成比预期更多的指令,但我不认为它会是这样的.以下是反汇编列表中的代码段:
225: LATDSET = 0x0040;
sw s1,24808(s2)
sw s4,24808(s2)
sw s1,24808(s3)
sw s4,24808(s3)
sw s1,24808(s3)
226: {
227: porte = PORTE;
lw t1,24848(s4)
andi v0,t1,0xffff
lw v1,24848(s6)
andi ra,v1,0xffff
lw v0,24848(s6)
andi t2,v0,0xffff
lw a2,24848(s5)
andi v1,a2,0xffff
lw t2,t2,24848(s5)
andi t2,0xffff
228: if (porte & 0x0004)
andi t2,0x4
andi s8,ra,0x4
andi ra,0x4
andi a1,0x4
andi a2,0x4
229: pst_bytes_somi[0] |= sliding_bit;
or t3,t4,s0
xori a3,0x0
movz t3,s0,a3
addu s0,t3,zero
or t3,s1
xori a3,s8,s1,a3
addu s1,zero
or v1,0x0
movz v1,zero
or a0,s2
xori a3,a1,0x0
movz a0,s2,a3
addu s2,a0,a3
这似乎是一个疯狂的指令,用于在固定地址进行简单的读/写和测试变量.在不同的cpu上,我可能会将每个C语句降低到大约1..3条指令,而不需要使用手写的asm.显然,时钟频率相当高,但它不比我在不同cpu(例如dsPIC)中的时钟频率高10倍.
我已将优化设置为最大值.我的C编译器很糟糕(这是gcc 3.4.4)?或者这是典型的MIPS?
解决方法
终于找到了答案.反汇编列表完全是误导性的.编译器正在进行循环展开,我们在每个C语句下看到的实际上是指令数量的8倍,因为它正在展开循环8x.说明不在连续的地址!在编译器选项中关闭循环展开会产生以下结果:
225: LATDSET = 0x0040;
sw s3,24808(s2)
226: {
227: porte = PORTE;
lw t1,24848(s5)
andi v0,0xffff
228: if (porte & 0x0004)
andi t2,0x4
229: pst_bytes_somi[0] |= sliding_bit;
or t3,zero
230:
对每个人都很恐慌.