首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >防止或阻止cpu数据缓存加载

防止或阻止cpu数据缓存加载
EN

Stack Overflow用户
提问于 2014-06-18 16:23:18
回答 4查看 1.2K关注 0票数 1

我的任务是评估各种类型的ARM处理器(基准测试),特别是片上系统(SOC)。有些SOC有大量的数据缓存,而另一些则很少。因此,我希望我的程序阻止数据缓存。

我写了一个Walking 1测试,它访问核心外的内存,但在SOC上。我将在我们现在的处理器上运行这个程序,它只有很少的数据缓存,并且运行在一个具有大量数据缓存内存的Cortex M3处理器上。

我关注的是在处理器之外获取内存的持续时间。如果我将Walking 1的内存大小设置为大于数据缓存的大小,则要在时间上运行测试“指数”。例如,对于一个小内存,测试在分钟内运行,对于较大的内存大小,测试需要几个小时。

问题:是否有一个成语可以防止处理器将整个数组加载到处理器的数据缓存中?

(注意:这是标记为C和C++,因为我可以选择两种语言之间的选择。如果C没有成语,但C++有,我将首先尝试C++。)

  • 平台:各种嵌入式或系统的芯片(开发/评估板),没有操作系统。
  • 处理器: ARM Cortex系列芯片上有不同的外围设备和不同的数据缓存大小。
  • 编译器: IAR Embedded Workbench、GNU、GNU C++ (由不同的板供应商在后台使用)。
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-06-18 16:31:40

除非您的编译器提供了访问内存区域保护寄存器的函数,否则您需要做一些组装来将内存区域设置为不可缓存的:

http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0290g/Chdhdahb.html

或如下文所述,通过c1控制寄存器的第2位和第12位全局禁用一级数据和指令缓存,通过协处理器寄存器15 = CP 15访问:

http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0338g/Babebdcb.html

http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0338g/Babgdhif.html

这假设您的ARM处理器具有CP 15功能。可能还有其他控制寄存器可能对您的测试有用。我不知道在没有CP 15功能的ARM处理器上如何做到这一点。

票数 2
EN

Stack Overflow用户

发布于 2014-06-18 17:11:00

如果您不能理解@rcglfr所说的内容,您可以按照缓存行的大小来迭代数据。

票数 1
EN

Stack Overflow用户

发布于 2014-06-18 18:03:48

为了避免修改MMU表,您只需禁用数据缓存(如果有1,则禁用L2缓存)。

在ARM926EJ-S上,这样做如下:

代码语言:javascript
运行
复制
// Enable the data cache
FUNC_START_ARM(hal_dcache_enable,r1)
    push    {lr}
    mov     r0,#0
    mcr     p15,0,r0,c7,c6,0            /* invalidate d-cache */
    mrc     p15,0,r1,c1,c0,0
    orr     r1,r1,#0xC
    /* enable DCache and write buffer */
    mcr     p15,0,r1,c1,c0,0
    pop     {lr}
    bx      lr

// Disable the data cache (and invalidate it, required semantics)
FUNC_START_ARM(hal_dcache_disable,r1)
    push    {lr}
1:  mrc     p15,0,r15,c7,c14,3
    bne     1b
    mrc     p15,0,r1,c1,c0,0
    bic     r1,r1,#0xC
    /* disable DCache AND write buffer  */
    mcr     p15,0,r1,c1,c0,0
    mov     r1,#0
    mcr     p15,0,r1,c7,c6,0    /* clear data cache */
    pop     {lr}
    bx      lr

只需查看ARM体系结构参考手册就可以知道如何禁用手臂上的d-cache。

在启用/禁用缓存时,一定要遵循有关缓存失效的ARM准则(这取决于您的ARM核心)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24290610

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档