【发布时间】:2015-11-01 17:07:26
【问题描述】:
我想要一些建议来优化我的代码,这是一个简单的代码,但它需要快速,快速我的意思是小于 250 ns。
我的第一个代码很慢,大约 1000 ns,但经过一些工作后大约 550 ns
但我相信它可以做得更快,但我不知道如何:
我正在使用具有 80 MHz 系统时钟的 PIC32
我的代码:
void main()
{
unsigned long int arr_1[4095];
unsigned long int arr_2[4095];
//here I assign arr_1 and arr_2 values
//...
//...
TRISC = 0;
TRISD = 0;
while(1){
LATC = arr_1[PORTE];
LATD = arr_2[PORTE];
}
}
您可以看到它作为一项工作非常简单,唯一的问题是速度。
我看到汇编列表只是为了看看有多少指令,但我不知道汇编语言来优化它。
;main.c, 14 :: LATC = arr_1[PORTE];
0x9D000064 0x27A30000 ADDIU R3, SP, 0
0x9D000068 0x3C1EBF88 LUI R30, 49032
0x9D00006C 0x8FC26110 LW R2, 24848(R30)
0x9D000070 0x00021080 SLL R2, R2, 2
0x9D000074 0x00621021 ADDU R2, R3, R2
0x9D000078 0x8C420000 LW R2, 0(R2)
0x9D00007C 0x3C1EBF88 LUI R30, 49032
0x9D000080 0xAFC260A0 SW R2, 24736(R30)
;main.c, 15 :: LATD = arr_2[PORTE];
0x9D000084 0x27A33FFC ADDIU R3, SP, 16380
0x9D000088 0x3C1EBF88 LUI R30, 49032
0x9D00008C 0x8FC26110 LW R2, 24848(R30)
0x9D000090 0x00021080 SLL R2, R2, 2
0x9D000094 0x00621021 ADDU R2, R3, R2
0x9D000098 0x8C420000 LW R2, 0(R2)
0x9D00009C 0x3C1EBF88 LUI R30, 49032
;main.c, 16 :: }
0x9D0000A0 0x0B400019 J L_main0
0x9D0000A4 0xAFC260E0 SW R2, 24800(R30)
对优化我的代码有什么建议吗?
编辑:
*PORTE、LATC 和 LATD 是 I/O 映射寄存器
*代码的目标是在 PORTE 改变时尽快改变 LATC 和 LATD 寄存器(所以 PORTE 是输入,LATC 和 LATD 是输出),输出取决于 PORTE 的值
【问题讨论】:
-
代码永远不会退出,所以实际运行时间是“永远”。你到底在测量什么?很可能,大部分运行时间(“永远”循环除外)都用于设置数组值,而您没有发布重要的细节。
-
你是如何编译/链接代码的?你在使用任何优化参数吗? (对于 gcc,建议
-o3) -
您可能需要清楚 PORTE、LATC 和 LATD 是什么 - 特别是如果它们是
volatile或 I/O 映射的。 -
@user3629249 我的衡量标准是更改 PORTE 时更改 LATC 和 LATD 所需的时间。
-
@Clifford 他们是 I/O 映射的