硬汉嵌入式论坛

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

[Cache] cache策略配置问题

[复制链接]

18

主题

321

回帖

375

积分

高级会员

积分
375
发表于 2019-3-30 10:34:31 | 显示全部楼层 |阅读模式
看手册是说cache的策略配置是由TEX位来决定的,C决定是否启用CAHCE,B是否启用缓冲,S是共享
TIM截图20190330100239.png
    1,配置AXI SRAM属性为Write back, Read allocate Write allocate
  1. MPU_InitStruct.Enable           = MPU_REGION_ENABLE;
  2.         MPU_InitStruct.BaseAddress      = 0x24000000;
  3.         MPU_InitStruct.Size             = MPU_REGION_SIZE_512KB;
  4.         MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
  5.         MPU_InitStruct.IsBufferable     = MPU_ACCESS_BUFFERABLE;
  6.         MPU_InitStruct.IsCacheable      = MPU_ACCESS_CACHEABLE;
  7.         MPU_InitStruct.IsShareable      = MPU_ACCESS_NOT_SHAREABLE;
  8.         MPU_InitStruct.Number           = MPU_REGION_NUMBER0;
  9.         MPU_InitStruct.TypeExtField     = MPU_TEX_LEVEL1;
  10.         MPU_InitStruct.SubRegionDisable = 0x00;
  11.         MPU_InitStruct.DisableExec      = MPU_INSTRUCTION_ACCESS_ENABLE;
复制代码
上面的MPU配置的意思为:MPU配置 地址0x24000000 长度512K(正好是AXI SRAM的大小),全访问权限,允许缓冲,允许cache,不共享,域编号0,扩展域为1,禁止子域为0,允许指令访问。

这里的B设置的是允许缓冲,允许缓冲就是write back,反之就是write through。因为设置的是全访问权限,允许指令访问,所以这里就是Read allocate Write allocate

  2,配置FMC扩展IO的MPU属性为Device或者Strongly Ordered
  1. MPU_InitStruct.Enable           = MPU_REGION_ENABLE;
  2.         MPU_InitStruct.BaseAddress      = 0x60000000;
  3.         MPU_InitStruct.Size             = ARM_MPU_REGION_SIZE_64KB;       
  4.         MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
  5.         MPU_InitStruct.IsBufferable     = MPU_ACCESS_BUFFERABLE;
  6.         MPU_InitStruct.IsCacheable      = MPU_ACCESS_NOT_CACHEABLE;
  7.         MPU_InitStruct.IsShareable      = MPU_ACCESS_NOT_SHAREABLE;
  8.         MPU_InitStruct.Number           = MPU_REGION_NUMBER1;
  9.         MPU_InitStruct.TypeExtField     = MPU_TEX_LEVEL0;
  10.         MPU_InitStruct.SubRegionDisable = 0x00;
  11.         MPU_InitStruct.DisableExec      = MPU_INSTRUCTION_ACCESS_ENABLE;
复制代码
上面的MPU配置的意思为:MPU配置 地址0x60000000 长度64K,全访问权限,允许缓冲,不允许cache,不共享,域编号1,扩展域为0,禁止子域为0,允许指令访问。

问题1,cache策略的是write back还是write through,取决与IsBufferable
问题2,FMC配置中不使用cache,属性device指的是什么?
问题3,TEX是由哪几个MPU结构体成员决定的?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106757
QQ
发表于 2019-3-30 10:38:25 | 显示全部楼层
第1点理解错了,先把这个纠正下,MPU_TEX_LEVEL1的时候才是Read allocate Write allocate

其它问题看教程MPU和Cache章节,要多读几遍才行。
http://www.armbbs.cn/forum.php?m ... &extra=page%3D1
回复

使用道具 举报

18

主题

321

回帖

375

积分

高级会员

积分
375
 楼主| 发表于 2019-3-30 10:58:07 | 显示全部楼层
eric2013 发表于 2019-3-30 10:38
第1点理解错了,先把这个纠正下,MPU_TEX_LEVEL1的时候才是Read allocate Write allocate

其它问题看教 ...

谢谢硬汉哥的回复,您写的教程,问题二已经找到答案。继续看,找下其他答案 TIM截图20190330105536.png


回复

使用道具 举报

18

主题

321

回帖

375

积分

高级会员

积分
375
 楼主| 发表于 2019-3-30 11:04:03 | 显示全部楼层
RASR寄存器的XN位表示指令提取的权限
MPU_INSTRUCTION_ACCESS_ENABLE       表示使能指令提取,即这块内存区可以执行程序代码。
MPU_INSTRUCTION_ACCESS_DISENABLE  表示禁止指令提取,即这块内存区禁止执行程序代码。
回复

使用道具 举报

18

主题

321

回帖

375

积分

高级会员

积分
375
 楼主| 发表于 2019-3-30 11:09:24 | 显示全部楼层
在MPU章节全部找到答案,看样子还是读少了,要带着问题去读。
回复

使用道具 举报

0

主题

77

回帖

77

积分

初级会员

积分
77
发表于 2019-5-13 15:21:20 | 显示全部楼层
本帖最后由 艾那的小强 于 2019-5-13 15:22 编辑

请教楼主及硬汉哥。
打开cache,并使用下面的MPU配置代码:
  1. MPU_InitStruct.Enable           = MPU_REGION_ENABLE;
  2.         MPU_InitStruct.BaseAddress      = 0x24000000;
  3.         MPU_InitStruct.Size             = MPU_REGION_SIZE_512KB;
  4.         MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
  5.         MPU_InitStruct.IsBufferable     = MPU_ACCESS_NOT_BUFFERABLE;//这里改成不缓冲
  6.         MPU_InitStruct.IsCacheable      = MPU_ACCESS_CACHEABLE;
  7.         MPU_InitStruct.IsShareable      = MPU_ACCESS_NOT_SHAREABLE;
  8.         MPU_InitStruct.Number           = MPU_REGION_NUMBER0;
  9.         MPU_InitStruct.TypeExtField     = MPU_TEX_LEVEL1;
  10.         MPU_InitStruct.SubRegionDisable = 0x00;
  11.         MPU_InitStruct.DisableExec      = MPU_INSTRUCTION_ACCESS_ENABLE;
复制代码


使用该区域的一块内存作为DMA串口接收缓冲区dma_buffer,然后定义了一个串口读接口,
int dma_rx(char *data, int length)
{
    ...
    memcpy(data, dma_buffer + get_index, recv_len);
}
读接口内部是拷贝DMA缓冲区的数据,但测试的结果是,该接口返回的数据总是0(也就是没有拷贝出来)。
但是使用jlink仿真时,断点下到memcpy那里,可以看到dma_buffer里面是有数据的。
看了硬汉歌的教程之后,知道在memcpy之前加一句SCB_InvalidateDCache_by_Addr就行了。
另外,不使用cache时,该接口返回正常。

我的问题是:
1. 如果使用了DMA的功能,那么DMA用到(读或者写)的那块内存缓存区位于哪个Domain就把那个Domain按上面的MPU配置进行设置,并且在CPU操作这块DMA缓存区时都要SCB_InvalidateDCache_by_Addr一下吗?
2. 如果为DMA缓存区单独配置一个MPU的话应该也可以达到目的,不过,如果系统中有多个DMA功能时,该怎么使用cache及MPU呢?

还请楼主及硬汉哥给指点迷津。谢谢。
回复

使用道具 举报

18

主题

321

回帖

375

积分

高级会员

积分
375
 楼主| 发表于 2019-5-13 17:41:24 | 显示全部楼层
本帖最后由 王海靖 于 2019-5-13 17:51 编辑
艾那的小强 发表于 2019-5-13 15:21
请教楼主及硬汉哥。
打开cache,并使用下面的MPU配置代码:

目前我还并没有测试过DMA。你的MPU配置的是整个AXI SRAM 的 512K 区域 来分析一下这个cache策略


TIM截图20190513173706.png


应该就是上图的配置。


而且还有一个很重要的问题,H7DMA分为MDMA DMA1 DMA2和BDMA,你用的哪一个,这个总线访问是由限制的。






回复

使用道具 举报

0

主题

77

回帖

77

积分

初级会员

积分
77
发表于 2019-5-14 11:11:50 | 显示全部楼层
王海靖 发表于 2019-5-13 17:41
目前我还并没有测试过DMA。你的MPU配置的是整个AXI SRAM 的 512K 区域 来分析一下这个cache策略

我用的是DMA1.
D1域的内存是不能用的,所以我用的是AXI SRAM(D2)。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-4 14:01 , Processed in 0.284267 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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