ARM处理器通常同时具有I/D 缓存和写缓冲区。写入缓冲区的想法是将顺序写入组合在一起(非常适合同步 DRAM),并且不会延迟 CPU 等待写入完成。
一般而言,您可以刷新d 缓存和写入缓冲区。以下是一些适用于许多架构和内存配置的内联ARM汇编程序。
static inline void dcache_clean(void)
{
const int zero = 0;
/* clean entire D cache -> push to external memory. */
__asm volatile ("1: mrc p15, 0, r15, c7, c10, 3\n"
" bne 1b\n" ::: "cc");
/* drain the write buffer */
__asm volatile ("mcr 15, 0, %0, c7, c10, 4"::"r" (zero));
}
如果您有L2 缓存,您可能需要更多。
要在 Linux 环境中回答,有不同的CPU变体和不同的例程,具体取决于内存/MMU 配置甚至 CPU 勘误表。参见例如,
这些例程要么直接调用,要么在带有函数指针的cpu info结构中查找,这些函数指针指向检测到的 CPU 和配置的适当例程;取决于内核是针对单个 CPU还是多用途(例如Ubuntu 发行版)。
要专门针对您的情况回答问题,我们需要了解L2 缓存、写入缓冲内存、CPU 架构细节;可能包括勘误表的硅修订。另一种策略是通过使用将内存标记为不可缓存和不可缓冲的dma_alloc_XXX()
例程来完全避免这种情况,以便 CPU 写入立即被推送到外部。根据您的内存访问模式,任何一种解决方案都是有效的。如果内存只需要在某个检查点同步(视频等的vsync /*hsync* 等),您可能希望缓存。