硬汉嵌入式论坛

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

[FlexRAM] FlexRAM动态配置DTCM的大小失败是什么原因?

[复制链接]

8

主题

26

回帖

243

积分

高级会员

积分
243
发表于 2018-4-9 15:52:44 | 显示全部楼层 |阅读模式
本帖最后由 xufeixueren 于 2018-4-9 15:54 编辑

IRT1050的FlexRAM包含三个部分:ITCM、DTCM、OCRAM。MCU启动后,默认使用eFUSE静态分配,ITCM、DTCM、OCRAM的大小分别是128K、128K、256K。现在我想动态配置ITCM、DTCM、OCRAM的大小分别为0、256K、256K,使用如下代码:
      IOMUXC_GPR->GPR17 = 0xaaaa5555;
      IOMUXC_GPR->GPR16 |= 0x07;
但是配置失败,使用DTCM做堆栈空间,加大堆栈边界,测试结果是堆栈空间边界加大后原来正常运行的代码无法正常运行,说明DTCM并没有加大。


然后我配置ITCM、DTCM、OCRAM的大小分别为0、0、512K,代码如下:
      IOMUXC_GPR->GPR17 = 0x55555555;
      IOMUXC_GPR->GPR16 |= 0x07;
使用OCRAM做堆栈空间,加大堆栈边界,测试结果是堆栈空间边界加大后原来正常运行的代码仍然正常运行,说明OCRAM加大配置成功。


减小DTCM的大小,配置ITCM、DTCM、OCRAM的大小分别为128K、64K、320K,代码如下:
     IOMUXC_GPR->GPR17 = 0xffa55555;
      IOMUXC_GPR->GPR16 |= 0x07;
使用DTCM做堆栈空间,减小堆栈边界,测试结果是堆栈空间边界减小后原来正常运行的代码仍然正常运行,说明DTCM减小配置成功。



问题:为什么DTCM可以在默认值基础上动态配置减小,却不能动态配置加大?是不是DTCM配置加大的时候需要有其它的设置,比如说时钟之类的需要配置?

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107478
QQ
发表于 2018-4-9 17:26:00 | 显示全部楼层
我还没用过RT1050,仅以我使用H7的进行说明。

你已经配置好的工程,看你的map文件,CM内核的栈空间向下生长的满栈
1、根据你工程使用RAM的大小,MDK优先安排栈stack,注意栈的位置并不一定是从你RAM最边界开始的,是由你实际使用的RAM大小决定。
2、然后安排堆heap空间,最后就是你的全局变量空间等。

只要你修改的DTCM ITCM OCRAM不影响这个区域,你的程序正常就不会受到影响。除非芯片修改后会触发什么特别的东西。
回复

使用道具 举报

0

主题

154

回帖

154

积分

初级会员

积分
154
发表于 2018-4-9 17:45:40 | 显示全部楼层
建议切换的代码用汇编来写,以保证不占用任何的STACK空间
回复

使用道具 举报

8

主题

26

回帖

243

积分

高级会员

积分
243
 楼主| 发表于 2018-4-10 09:14:55 | 显示全部楼层
新发现:只要在初始化代码里不调用使能和禁能DCache的代码,配置是没问题的,代码如下:
#if 1
                //DTCM is 512KB
                //set gpr17 for DTCM
                IOMUXC_GPR->GPR17 = 0xffffffff;       
                //enable gpr16
                IOMUXC_GPR->GPR16 |= 0x04;
        #endif
               
/* Enable instruction and data caches */
#if defined(__ICACHE_PRESENT) && __ICACHE_PRESENT
   SCB_EnableICache();
#endif               
#if defined(__DCACHE_PRESENT) && __DCACHE_PRESENT
   //SCB_EnableDCache();
#endif

只要不用这句SCB_EnableDCache();,就可以正常配置。可能和DCache的配置有关。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107478
QQ
发表于 2018-4-10 09:53:32 | 显示全部楼层
如果是这样的话,就稍麻烦了,DTCM是不需要Cache的,那个OCRAM需要Cache,估计开头还配置了MPU。可以在配置MPU和Cache之前设置不同大小,也许可行。

如果之后的话,需要调用Cache的clean操作,将Cache里面的内容刷出来。SCB_CleanDCache。  
回复

使用道具 举报

8

主题

26

回帖

243

积分

高级会员

积分
243
 楼主| 发表于 2018-4-10 10:58:48 | 显示全部楼层
大神,现在的现象是:只要配置DTCM的大小大于默认的128K时,只要有DCache相关的操作,且不管是在设置DTCM之前还是之后使用了DCache相关的操作,都会导致代码无法正常运行。既然DTCM不需要Cache,我也没有用到OCRAM,DCache默认的配置是没有打开的,我不对DCache进行任何操作,是不是可行的呢?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107478
QQ
发表于 2018-4-10 12:13:18 | 显示全部楼层
xufeixueren 发表于 2018-4-10 10:58
大神,现在的现象是:只要配置DTCM的大小大于默认的128K时,只要有DCache相关的操作,且不管是在设置DTCM之 ...

可行的,你看下是不是MPU设置这个区域了,先关了。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107478
QQ
发表于 2018-4-10 12:17:05 | 显示全部楼层
另外官方有个手册的,还专门举了个例子,这个还是我去年时看的,具体印象不深了。

QQ截图20180410121443.png

回复

使用道具 举报

8

主题

26

回帖

243

积分

高级会员

积分
243
 楼主| 发表于 2018-4-10 15:33:05 | 显示全部楼层
我在SystemInit()函数里添加DTCM的代码,
#if 1
                //DTCM is 512KB
                //set gpr17 for DTCM
                IOMUXC_GPR->GPR17 = 0xffffffff;        
                //enable gpr16
                IOMUXC_GPR->GPR16 |= 0x04;
        #endif

然后把使能Cache的代码放到main函数里,
/* Enable I cache and D cache */
    SCB_EnableDCache();
    SCB_EnableICache();

这样代码就能正常运行了,推测可能配置DTCM之后需要延时等待它完成之后再使能Cache。
回复

使用道具 举报

0

主题

154

回帖

154

积分

初级会员

积分
154
发表于 2018-4-10 15:53:08 | 显示全部楼层
xufeixueren 发表于 2018-4-10 15:33
我在SystemInit()函数里添加DTCM的代码,
#if 1
                //DTCM is 512KB

那也许这样也可以
                //set gpr17 for DTCM
                IOMUXC_GPR->GPR17 = 0xffffffff;        
                //enable gpr16
                IOMUXC_GPR->GPR16 |= 0x04;
               
                __DSB();
               __ISB();
回复

使用道具 举报

8

主题

26

回帖

243

积分

高级会员

积分
243
 楼主| 发表于 2018-4-10 16:34:21 | 显示全部楼层
在DTCM配置前后都加了
__DSB(); __ISB();
验证这样做是不行的。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-3 10:48 , Processed in 0.192674 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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