硬汉嵌入式论坛

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

[SRAM] 请教DTCM和MPU的关系

[复制链接]

4

主题

1459

回帖

1471

积分

至尊会员

积分
1471
发表于 2024-7-25 10:06:20 | 显示全部楼层 |阅读模式
各位热心网友,请教一个问题,H7的DTCM内存,可以被MPU配置并保护吗?  谢谢!
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117546
QQ
发表于 2024-7-25 11:31:26 | 显示全部楼层
不要设置Cache属性,其它都可以。
回复

使用道具 举报

4

主题

1459

回帖

1471

积分

至尊会员

积分
1471
 楼主| 发表于 2024-7-25 13:01:52 | 显示全部楼层
eric2013 发表于 2024-7-25 11:31
不要设置Cache属性,其它都可以。

硬汉大哥,DTCM的内存,就是没法Cache的对吧?  即便是设置了,也没用,是这个意思吧?
回复

使用道具 举报

12

主题

53

回帖

89

积分

初级会员

积分
89
发表于 2024-7-25 13:46:26 | 显示全部楼层
eric2013 发表于 2024-7-25 11:31
不要设置Cache属性,其它都可以。

比如,我从SRAM3的数组向DTCMRAM的数组调用memcpy拷贝数据,需要InvalidDcache这类函数操作下吗? 反过来呢?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117546
QQ
发表于 2024-7-26 08:29:05 | 显示全部楼层
morning_enr6U 发表于 2024-7-25 13:01
硬汉大哥,DTCM的内存,就是没法Cache的对吧?  即便是设置了,也没用,是这个意思吧?

DTCM的主频和Cache的主频是一样的,所以不需要配置,配置了反倒运行有问题。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117546
QQ
发表于 2024-7-26 08:29:55 | 显示全部楼层
capw 发表于 2024-7-25 13:46
比如,我从SRAM3的数组向DTCMRAM的数组调用memcpy拷贝数据,需要InvalidDcache这类函数操作下吗? 反过来 ...

这种的不需要,只有多主控才需Clean和无效化之类的操作。
回复

使用道具 举报

4

主题

1459

回帖

1471

积分

至尊会员

积分
1471
 楼主| 发表于 2024-7-26 08:57:55 | 显示全部楼层
eric2013 发表于 2024-7-26 08:29
这种的不需要,只有多主控才需Clean和无效化之类的操作。

Dingtalk_1.jpg

硬汉大哥,TCM的主频,Datasheet上有说明,H743的主频480M,TCM为400M,   那Cache是480M还是400M ? 有点疑惑!
回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2024-7-26 08:58:14 | 显示全部楼层
是的,TCM和CPU核是直连的,中间会跳过Cache, 开不开效果都一样
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117546
QQ
发表于 2024-7-26 09:27:13 | 显示全部楼层
morning_enr6U 发表于 2024-7-26 08:57
硬汉大哥,TCM的主频,Datasheet上有说明,H743的主频480M,TCM为400M,   那Cache是480M还是400M ? ...

你的截图的时钟分频都是400M下的。

主频480M,Cache,TCM都是480, 其它是240
回复

使用道具 举报

4

主题

1459

回帖

1471

积分

至尊会员

积分
1471
 楼主| 发表于 2024-7-26 10:56:13 | 显示全部楼层
eric2013 发表于 2024-7-26 09:27
你的截图的时钟分频都是400M下的。

主频480M,Cache,TCM都是480, 其它是240

回复

使用道具 举报

0

主题

4

回帖

4

积分

新手上路

积分
4
发表于 2025-1-11 21:11:44 | 显示全部楼层
eric2013 发表于 2024-7-26 08:29
DTCM的主频和Cache的主频是一样的,所以不需要配置,配置了反倒运行有问题。

硬汉大哥,为啥我H743用了DTCM测试读取内存速度和AXI总线的SRAM读取速度相当啊,且开启Cache后对DTCM的读写速度影响很大(更快了),感觉像是DTCM没设置成功,但是地址打印又已经是0x2000000区域的DTCM内存区了,很困惑
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117546
QQ
发表于 2025-1-12 07:21:27 | 显示全部楼层
Zeidan 发表于 2025-1-11 21:11
硬汉大哥,为啥我H743用了DTCM测试读取内存速度和AXI总线的SRAM读取速度相当啊,且开启Cache后对DTCM的读 ...

方便的话,分享你的测试代码看下,这个是我早期的测试




回复

使用道具 举报

0

主题

4

回帖

4

积分

新手上路

积分
4
发表于 2025-1-12 16:56:13 | 显示全部楼层
eric2013 发表于 2025-1-12 07:21
方便的话,分享你的测试代码看下,这个是我早期的测试

[C] 纯文本查看 复制代码
// TCM内存分配
static uint32_t tcm_buffer[MEM_SIZE];
// SRAM内存分配
static uint32_t __attribute__((section(".RAM_D1"))) sram_buffer[MEM_SIZE];

// 读测试
void bench_mem_read(const char* name, uint32_t* mem, size_t size) {
    volatile uint32_t temp;
    for(size_t i = 0; i < size; i++) {
        int s = DWT->CYCCNT;
        temp = mem[i];
        int e = DWT->CYCCNT;
        rt_kprintf("read time: %d\n", e - s);
    }
}

// 写测试
void bench_mem_write(const char* name, uint32_t* mem, size_t size) {
    for(size_t i = 0; i < size; i++) {
        int s = DWT->CYCCNT;
        mem[i] = (uint32_t)i;
        int e = DWT->CYCCNT;
        rt_kprintf("write time: %d\n", e - s);
    }
}


我的大致测试思路是启用DTCM为主内存,手动分配SRAM内存,然后通过这两个核心函数测试取值赋值的计数,前面两者基本上没啥差距(Cache全部Disable了,SRAM的MPU也设置成了NOTCACHEABLE,总体来说DTCM的情况稍好一点),后面我试着调高了代码编译的优化等级,同时勾选了时间优化的选项,结果倒是比较正常了
开启代码优化前:

开启代码优化后:


我总结下我的问题,烦请硬汉哥指教一下:
1. 是不是我的测试代码走了弯路导致大部分时间花在了其他地方而不是内存访问(结合优化等级的影响我觉得比较合理)?
2. 实验过程中发现DTCM的访问时间确定性确实很稳定,200轮测试访问CPU周期都是409个周期(第一次访问431周期原因未知,也是我疑惑的地方),而SRAM会不定时出现访问周期骤变的情况,针对这两个现象我怀疑和DTCM或SRAM内部的内存分区有关(Bank、Chunk之类),想请问下硬汉哥该怎么解释?
3. 看手册了解到DTCM的数据总线是和CPU同频的,理论上是不是一个CPU周期就能够读取64bit数据(TCM总线位宽为64)?我也看了硬汉哥的例程手册,上面有提过实际上RAM达不到400MHz,我的测试速度慢是不是和这个也有关系?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117546
QQ
发表于 2025-1-13 09:30:59 | 显示全部楼层
Zeidan 发表于 2025-1-12 16:56
[mw_shl_code=c,true]// TCM内存分配
static uint32_t tcm_buffer[MEM_SIZE];
// SRAM内存分配

这个for循环测试不行,优先改进下,比如测试1MB数据量,for循环里面展开for测试,比如16个赋值为一组测试。

然后就是 int s = DWT->CYCCNT时间测试,这个要在for之外添加。不要放在里面。还有就是printf也放到外面,时间测试之外
回复

使用道具 举报

7

主题

24

回帖

50

积分

初级会员

积分
50
发表于 2025-1-13 13:14:54 | 显示全部楼层
eric2013 发表于 2024-7-26 08:29
DTCM的主频和Cache的主频是一样的,所以不需要配置,配置了反倒运行有问题。

请教硬汉,这个有点不明白:
以H723为例子:
如果先把ICache和DCache都设为enable,那么是不是要在MPU中使用两个区,分别设置ITCM(0x00000000+64K)和DTCM(0x20000000+128K)为Non-cachable,如下:

TEX=1
C=0
B=0
S=0
回复

使用道具 举报

0

主题

4

回帖

4

积分

新手上路

积分
4
发表于 2025-1-13 19:59:13 | 显示全部楼层
eric2013 发表于 2025-1-13 09:30
这个for循环测试不行,优先改进下,比如测试1MB数据量,for循环里面展开for测试,比如16个赋值为一组测试 ...

okk,谢谢硬汉哥,我去试试
回复

使用道具 举报

26

主题

73

回帖

151

积分

初级会员

积分
151
QQ
发表于 2025-1-13 22:06:57 | 显示全部楼层
我在分散加载文件中,指定了ITCM和DTCM的地址范围,并在程序中创建很多全局变量指定到ITCM和DTCM。
经过测试,在MPU中,ITCM和DTCM必须允许cache,允许缓冲,否则level -3并勾选optimize for time优化后,不能开机。
回复

使用道具 举报

0

主题

4

回帖

4

积分

新手上路

积分
4
发表于 2025-1-14 00:28:35 | 显示全部楼层
pnhywyb 发表于 2025-1-13 22:06
我在分散加载文件中,指定了ITCM和DTCM的地址范围,并在程序中创建很多全局变量指定到ITCM和DTCM。
经过测 ...

我在RT-Thread上情况类似,不使用ITCM、DTCM同时不使能Cache、不允许缓冲,优化等级O3,勾选optimize for time后,RT-Thread会直接崩掉无法开机;其他条件不变,取消勾选optimize for time选项则能够正常运行;
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-14 06:35 , Processed in 0.078500 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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