本帖最后由 DX3906 于 2025-7-1 14:41 编辑
在for循环前后反转io并用逻辑分析仪测量高电平时间可以知道代码耗时,下面是我测试的结果,不过我不是在stm32上跑的,不用管时间的绝对数值,只需要看相对比例就好
先看原代码,两层for循环一共耗时233.64u:
[C] 纯文本查看 复制代码 void Copy_Fifo(void)
{
unsigned int inc = 0;
if(tc_flag == 1)
{
RGPIO_WritePinOutput(EXT_GPIO01_GPIO, EXT_GPIO01_GPIO_PIN, 1);
for(int i = 0; i < FIFO_DBS_0 ; i ++ )
{
for(uint16_t j =0; j<6; j++)
{
fifo_data[inc] = src_fifo[j][i];
inc++;
}
}
RGPIO_WritePinOutput(EXT_GPIO01_GPIO, EXT_GPIO01_GPIO_PIN, 0);
tc_flag = 0;
}
}
然后是改进的代码,把里面的for循环展开了,耗时64.46us:
[C] 纯文本查看 复制代码 void Copy_Fifo(void)
{
unsigned int inc = 0;
if(tc_flag == 1)
{
RGPIO_WritePinOutput(EXT_GPIO01_GPIO, EXT_GPIO01_GPIO_PIN, 1);
for(int i = 0; i < FIFO_DBS_0 ; i ++ )
{
fifo_data[inc++] = src_fifo[0][i];
fifo_data[inc++] = src_fifo[1][i];
fifo_data[inc++] = src_fifo[2][i];
fifo_data[inc++] = src_fifo[3][i];
fifo_data[inc++] = src_fifo[4][i];
fifo_data[inc++] = src_fifo[5][i];
}
RGPIO_WritePinOutput(EXT_GPIO01_GPIO, EXT_GPIO01_GPIO_PIN, 0);
tc_flag = 0;
}
}
以上测试均在关掉dcache的情况下跑的,编译器0级优化
可以看到,只需要把最里层的for循环展开,就能获得74%的性能提升,所以是双层for拖慢了整体效率
|