嵌入式技术论坛
直播中

王军

8年用户 1858经验值
私信 关注
[问答]

SPI改变时钟频率或者加上DMA对SPI FLASH性能有何影响?

环境

硬件ART-PI STM32H750
SPI FLASH W25Q128

测试

我对W25Q128使用MSH命令fal bench进行测试
art-pi默认的驱动是50MHZ+轮询驱动的

改变频率测试

50MHz+轮询

2.jpg

100MHz+轮询

2.jpg

额,居然还是劣势…可能是驱动能力跟不上读写速度了?

改变驱动方式测试

50Mhz+DMA

2.jpg

100Mhz+DMA

2.jpg

测的第两次

2.jpg

对比没有DMA的话,在读取和擦除方面有提升

总结

啥方式对于写入的影响都不大,速度都是一样的.
提升时钟频率的话,要求驱动能力也要跟上(例如加上DMA),不然改变变化不大.甚至倒退?

问题

所以我测试的是否有问题?
加入DMA对读取和擦除为什么可以有影响?
为什么怎么改变方式,对于擦除没有任何影响?
为什么提升频率反而会性能在某方面下降?

回帖(1)

王超

2023-2-2 15:24:28
你加入DMA后,感觉上没有什么提升呢。

原始的drv_spi.c的程序代码中,无论是否使用DMA,spixfer函数的部分内容如下:

其中,一大段注释后的等待信号量操作是我参考csdn的一篇blog添加的DMA处理。

从程序代码中可以看到,原版驱动对于DMA没有做处理,所以轮询也罢,DMA也罢,这段时间CPU都用来等数据传输完毕。在STM32F4 + ADC7616硬件平台,对spi驱动添加信号量处理后,性能会有明显提升。

我依稀记得当时的测试结果是,1ksps sample条件下,CPU使用率从78%降低到了21%。

static rt_uint32_t spixfer(struct rt_spi_device *device, struct rt_spi_message *message, rt_sem_t sem)
{
    while (message_length)
    {
        /* For simplicity reasons, this example is just waiting till the end of the
           transfer, but application may perform other tasks while transfer operation
           is ongoing. */
        while (HAL_SPI_GetState(spi_handle) != HAL_SPI_STATE_READY)
        {
                rt_sem_take(sem, RT_WAITING_FOREVER);
        }
    }
}
当然,不仅仅是修改这个函数,对于spi驱动中的数据结构部分还要进行部分改动。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分