我的任务是评估各种类型的ARM处理器(基准测试),特别是片上系统(SOC)。有些SOC有大量的数据缓存,而另一些则很少。因此,我希望我的程序阻止数据缓存。
我写了一个Walking 1测试,它访问核心外的内存,但在SOC上。我将在我们现在的处理器上运行这个程序,它只有很少的数据缓存,并且运行在一个具有大量数据缓存内存的Cortex M3处理器上。
我关注的是在处理器之外获取内存的持续时间。如果我将Walking 1的内存大小设置为大于数据缓存的大小,则要在时间上运行测试“指数”。例如,对于一个小内存,测试在分钟内运行,对于较大的内存大小,测试需要几个小时。
问题:是否有一个成语可以防止处理器将整个数组加载到处理器的数据缓存中?
(注意:这是标记为C和C++,因为我可以选择两种语言之间的选择。如果C没有成语,但C++有,我将首先尝试C++。)
发布于 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处理器上如何做到这一点。
发布于 2014-06-18 17:11:00
如果您不能理解@rcglfr所说的内容,您可以按照缓存行的大小来迭代数据。
发布于 2014-06-18 18:03:48
为了避免修改MMU表,您只需禁用数据缓存(如果有1,则禁用L2缓存)。
在ARM926EJ-S上,这样做如下:
// 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核心)。
https://stackoverflow.com/questions/24290610
复制相似问题