硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1117|回复: 9
收起左侧

[SDRAM] sdram在noncache区域读取速度异常缓慢的问题

[复制链接]

1

主题

8

回帖

11

积分

新手上路

积分
11
发表于 2022-5-13 20:52:57 | 显示全部楼层 |阅读模式
本帖最后由 qq240997293 于 2022-5-13 21:03 编辑

前提描述:
1.定义sdram的0x81800000开始,大小为0x00800000的区域为noncache区,在这个noncache区中,LCD的显存区域也在这个区域,一共定义了5帧数据,每帧800*480*4 byte;
2.采用野火RT1052的配置,系统的时钟为528000000 image.png
SEMC外设的时钟为198000000 image.png
3.MPU的配置如下: image.png .

问题描述:
本人采用了几种读写数据方式,测试读写速度。
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方式去实现,因为我再测试时,虽然速度整体变快了,但是图像的显示会错乱,存在异常像素的问题。



T3020M_APP.zip

8.81 MB, 下载次数: 1

工程

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107128
QQ
发表于 2022-5-14 10:05:31 | 显示全部楼层

回帖奖励 +5 个金币

1、开启Cache后,如果Cache命中,是直接从Cache读取数据,速度提升是巨大的。相当于主频速度读取了。
2、for循环展开测试,比如20个为一组,作为1次for
回复

使用道具 举报

1

主题

8

回帖

11

积分

新手上路

积分
11
 楼主| 发表于 2022-5-14 14:06:19 | 显示全部楼层
eric2013 发表于 2022-5-14 10:05
1、开启Cache后,如果Cache命中,是直接从Cache读取数据,速度提升是巨大的。相当于主频速度读取了。
2、f ...

1.开启cache我试过,是提升巨大,但是会导致lcd显示错乱,因为除了cpu需要对显存区域读写外,lcd也在以60Hz的速度对显存进行访问,这样就不能保证lcd读取到的数据是否与实际一致。
2.for循环展开测试是啥意思?我的写法就是
for(uint32_t i = 0; i < size; i+= sizeof(uint32_t))
{
    *(uint32_t *) addDir = *(uint32_t *) addSrc;
}
拷贝一帧的速度到了100ms,比memcpy那个69.6ms还慢
回复

使用道具 举报

1

主题

8

回帖

11

积分

新手上路

积分
11
 楼主| 发表于 2022-5-14 14:06:40 | 显示全部楼层
eric2013 发表于 2022-5-14 10:05
1、开启Cache后,如果Cache命中,是直接从Cache读取数据,速度提升是巨大的。相当于主频速度读取了。
2、f ...

1.开启cache我试过,是提升巨大,但是会导致lcd显示错乱,因为除了cpu需要对显存区域读写外,lcd也在以60Hz的速度对显存进行访问,这样就不能保证lcd读取到的数据是否与实际一致。
2.for循环展开测试是啥意思?我的写法就是
for(uint32_t i = 0; i < size; i+= sizeof(uint32_t))
{
    *(uint32_t *) addDir = *(uint32_t *) addSrc;
}
回复

使用道具 举报

1

主题

8

回帖

11

积分

新手上路

积分
11
 楼主| 发表于 2022-5-14 14:07:20 | 显示全部楼层
1.开启cache我试过,是提升巨大,但是会导致lcd显示错乱,因为除了cpu需要对显存区域读写外,lcd也在以60Hz的速度对显存进行访问,这样就不能保证lcd读取到的数据是否与实际一致。
2.for循环展开测试是啥意思?我的写法就是
for(uint32_t i = 0; i < size; i+= sizeof(uint32_t))
{
    *(uint32_t *) addDir = *(uint32_t *) addSrc;
}
回复

使用道具 举报

1

主题

8

回帖

11

积分

新手上路

积分
11
 楼主| 发表于 2022-5-14 14:07:41 | 显示全部楼层
eric2013 发表于 2022-5-14 10:05
1、开启Cache后,如果Cache命中,是直接从Cache读取数据,速度提升是巨大的。相当于主频速度读取了。
2、f ...

1.开启cache我试过,是提升巨大,但是会导致lcd显示错乱,因为除了cpu需要对显存区域读写外,lcd也在以60Hz的速度对显存进行访问,这样就不能保证lcd读取到的数据是否与实际一致。
2.for循环展开测试是啥意思?我的写法就是
for(uint32_t i = 0; i < size; i+= sizeof(uint32_t))
{
    *(uint32_t *) addDir = *(uint32_t *) addSrc;
}
回复

使用道具 举报

1

主题

8

回帖

11

积分

新手上路

积分
11
 楼主| 发表于 2022-5-14 14:27:26
eric2013 发表于 2022-5-14 10:05
1、开启Cache后,如果Cache命中,是直接从Cache读取数据,速度提升是巨大的。相当于主频速度读取了。
2、f ...

1.开启cache我试过,是提升巨大,但是会导致lcd显示错乱,因为除了cpu需要对显存区域读写外,lcd也在以60Hz的速度对显存进行访问,这样就不能保证lcd读取到的数据是否与实际一致。
2.for循环展开测试是啥意思?我的写法就是
for(uint32_t i = 0; i < size; i+= sizeof(uint32_t))
{
    *(uint32_t *) addDir = *(uint32_t *) addSrc;
}

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107128
QQ
发表于 2022-5-15 14:11:45 | 显示全部楼层
就是这个for循环要展开。多写几组 *(uint32_t *) addDir = *(uint32_t *) addSrc;
回复

使用道具 举报

1

主题

8

回帖

11

积分

新手上路

积分
11
 楼主| 发表于 2022-5-16 22:27:59 | 显示全部楼层
eric2013 发表于 2022-5-15 14:11
就是这个for循环要展开。多写几组 *(uint32_t *) addDir = *(uint32_t *) addSrc;

收到,这个方法我也试试;
咨询了NXP的人,他们推荐将cache区配置成写通型能有效的提升sdram的读取速度
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107128
QQ
发表于 2022-5-17 00:21:59 | 显示全部楼层
qq240997293 发表于 2022-5-16 22:27
收到,这个方法我也试试;
咨询了NXP的人,他们推荐将cache区配置成写通型能有效的提升sdram的读取速度

对,这样是最好的,然后就是配合无效化和Clean操作API即可。
回复

使用道具 举报

210

主题

1045

回帖

1685

积分

至尊会员

More we do, more we can do.

积分
1685
发表于 2022-5-17 23:07:01 | 显示全部楼层
Writes accesses that hit in the data cache are written into the cache RAMs. If the memory location is
marked as Write-Through, the write is also performed on the AXI bus, so that the data stored in the
RAM remains coherent with the external memory system.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-19 17:52 , Processed in 0.339741 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表