初级会员
- 积分
- 66
- 金钱
- 66
- 注册时间
- 2016-8-11
- 在线时间
- 16 小时
|
1金钱
本帖最后由 ntmusic 于 2019-4-4 14:47 编辑
求助大家,RT1052的SDRAM在使用时有没有要注意的事项,我在用时发现访问SDRAM速度非常非常慢。在应用中,我要从Flex SPI Flash中加载一张图片的像素数据到SDRAM中,然后对这个图片像素进行一些色彩处理,使用2层For循环嵌套遍历图片中的每一个像素,简单对像素颜色判断后把值放回SDRAM中另一块区域中。结果发现在SDRAM中处理800*480像素的RGB565格式图片,居然耗时180多毫秒,简直不可思议,然后我再试一下单纯把SDRAM中一块区域中的数据也用2层For循环搬移到另一块区域,中途不做任何处理,发现居然也要130多毫秒!这完全不能接受,怀疑是我的配置有问题,于是用正点原子的开发板和例程(号令者)同样做试验: 硬件环境:正点原子RT1052核心板+转接小板+7寸RGB接口TFT
测试程序:正点原子例程-实验19 eLCDIF(RGB屏)
为了测试,我在原实验源码基础上,修改了以下2点:
1、增加GPTimer1产生1ms中断用于计时
2、增加一个SDRAM数据拷贝测试程序,放到例程中的while(1)大循环前。该测试程序主要测试:
A:使用2层For循环搬运SDRAM中的数据,然后打印搬运用时。从地址0x80500000拷贝u16类型数据(800*480)个到地址0x805BB800。
B:使用memcpy函数拷贝SDRAM中的数据,地址和长度同上,打印搬运用时。
C:使用2层For循环,将Flex SPI Flash中地址0X60080000开始的数据拷贝到SDRAM中,数据类型同样为u16类型数据共(800*480)个。
D:使用memcpy替换两层For循环嵌套再执行C的数据搬运。
测试结果如下:
A:132ms B:49ms C:12ms D:12ms
可以看到A确实是非常非常慢,这肯定不科学吧!!然后我发现不论是例程源码,还是官方SDK Demo,都在MPU中把SDRAM大部分空间都配置为了无Cache,无缓存,而我定义的拷贝地址正好处于这部分空间(正点例程中,MPU_Memory_Protection函数的region7仅配置了2MB SDRAM可以使用Cache和缓存)。于是我把这个region7的值改大到32M,然后再在例程中测试,发现拷贝速度有了极大的提升:
A:16ms B:9ms C:12ms D:11ms
这速度看起来是正常的,于是我在我的项目中也修改了这个参数,但悲剧的是,显示错位了,图像处理后的数据也存在花点,完全不知道是怎么回事了。改了MPU各种参数,结果要么就是拷贝很慢,要么就是拷贝快了但花屏,请教原子哥和各位高手,到底要怎么设置才能保证SDRAM拷贝速度既快又不出错呢?
附件是我测试用的正点的程序,直接在正点开发板上即可运行。
注:在我的实际项目中,修改了分散加载文件,程序上电后从FlexSPI Flash中加载到ITCM中运行,运行变量在DTCM中,SDRAM主要用来做LCD显存,以及需要处理的图片数据。不知是否这样导致SDRAM速度快了然后出错?
|
|