前提描述:
1.定义sdram的0x81800000开始,大小为0x00800000的区域为noncache区,在这个noncache区中,LCD的显存区域也在这个区域,一共定义了5帧数据,每帧800*480*4 byte;
2. 采用野火RT1052的配置,系统的时钟为528000000
SEMC外设的时钟为198000000
3.MPU的配置如下:
问题描述:
本人采用了几种读写数据方式,测试读写速度。
1.使用memcpy,从noncache区的帧①拷贝到noncache区的帧②,耗时69.6ms;
2.使用memcpy,从cacheable区定义的一帧大小的数组拷贝到noncache区的帧①,耗时16.2ms;
3.使用memcpy,从noncache区的帧①拷贝数据到cacheable区定义的一帧大小的数组中,耗时70.0ms; 4.使用memset,将noncache区的帧①全都写成0x55,耗时5.8ms;
为什么从noncache读取数据会这么耗时呢?
我也尝试过用*(uint32_t *)和两个for循环的方式去拷贝数据,实际使用下来速度比使用memcpy更慢。
32位系统不应该按照32位读写才是最快速度吗?
因为该区域是显存区,不能使用cacheable方式去实现,因为我再测试时,虽然速度整体变快了,但是图像的显示会错乱,存在异常像素的问题。
如果使用DMA进行数据的拷贝,速度依然很慢。
附件是我目前测试sdram读写用的工程。
Hi @qq240997293 ,
这里主要是因为AXI总线写SDRAM是有pipeline的,也就是写命令会存到类似buffer的结构中,自动执行。MCU发完写命令就可以执行下一步了。而读命令是没有pipeline的,MCU必须等到命令返回才能执行下一步。更多内容请参考AN12437.
Regards,
Jing