ARM 开启Dcache 问题

本文探讨了ARM926EJS架构下Dcache的工作原理及特殊情况下的使用注意事项,包括不可缓存代码、自修改代码及AHB总线操作的影响,并提供了具体的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ARM926EJS Dcache是依赖于MMU,只有开启MMU后Dcache 才真正有效。

正常情况下,开启 Dcache 可以大大加快 CPU 性能;但是遇到特殊情况则出现很大的问题。

有以下三种情况:

  • 采用不可缓存代码;
  • 采用自修改代码;
  • 操作AHB总线。

  1. 采用不可缓存代码

    与其他ARM9系列的缓存内核来比,尽管非缓存代码的性能得到了改善,仍然推荐采用ICache,这是实践证明了的。

    非缓存代码通常用在boot loader上面,防止cache污染。但是现在ICache在没有启用MMU的情况下仍然能够使能,而且可以通过控制 cache lockdown register 来防止污染,所以采用非缓存代码是没有优点的。

  2. 采用自修改代码

    采用一个四字的缓冲区来保存推测到的将要获取的取指令。只有连续的指令可以准确地获取,万一 ARM9EJ-S 内核,缓冲区的内容会被丢掉(discard/flush)。在内核连续预取指的序列中,预取缓冲区的内容可能变为无效,这种情况下,预取缓冲器也应该被刷新(flush)。

  3. 操作AHB总线

     ss

为了保证数据和指令的一致性,必须做以下操作

1. Clean the DCache
2. Drain the write buffer
3. Synchronize data and instruction streams in level two AHB subsystems
4. Invalidate the ICache
5. Flush the prefetch buffer


代码如下:

clean_loop
MRC p15, 0, r15, c7, c10, 3 ; clean entire dcache using test and clean
BNE clean_loop
MCR p15, 0, r0, c7, c10, 4 ; drain write buffer
STR rx,[ry] ; nonbuffered store to signal L2 world to synchronize
MCR p15, 0, r0, c7, c5, 0 ; invalidate icache


c语言(iar):

<code>

__root unsigned int a_a=9;
#pragma optimize=none
void flush_cache(void)
{
    CP15_TestCleanDcache();
    CP15_DrainWriteBuffer();
    a_a ++;
    CP15_InvalidateIcache();
}

</code>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值