Для полноты, вот дополнительный код, который необходим для фактического включения кэширования данных после настройки MMU (а также кэширования инструкций, но это также работает без MMU):
void enable_data_cache()
{
asm volatile( " mrc p15, 0, r0, c1, c0, 0" ); // Read c1 into r0
asm volatile( " orr r0, r0, #4" ); // Set bit 2: Dcache
asm volatile( " mcr p15, 0, r0, c1, c0, 0" ); // Return r0 to c1
}
void disable_data_cache()
{
asm volatile( "_disable_data_cache_start_:" );
asm volatile( " mrc p15, 0, r15, c7, c14, 3" ); // test, clean and invalidate
asm volatile( " bne _disable_data_cache_start_" );
asm volatile( " mov r0,#0" );
asm volatile( " mcr p15, 0, r0, c7, c5, 0" ); // invalidate I cache
asm volatile( " mcr p15, 0, r0, c7, c10, 4"); // drain write buffer
asm volatile( " mrc p15, 0, r0, c1, c0, 0" ); // Read c1 into r0
asm volatile( " bic r0, r0, #4" ); // Clear bit 2: disable Dcache
asm volatile( " mcr p15, 0, r0, c1, c0, 0" ); // Return r0 to c1
}
void clean_data_cache()
{
asm volatile( "_clean_data_cache_start_:" );
asm volatile( " mrc p15, 0, r15, c7, c14, 3" ); // test, clean and invalidate
asm volatile( " bne _clean_data_cache_start_" );
}
void enable_instruction_cache()
{
asm volatile( " mrc p15, 0, r0, c1, c0, 0" ); // Read c1 into r0
asm volatile( " orr r0, r0, #4096" ); // Set bit 12: Icache
asm volatile( " mcr p15, 0, r0, c1, c0, 0" ); // Return r0 to c1
}
void disable_instruction_cache()
{
asm volatile( " mrc p15, 0, r0, c1, c0, 0" ); // Read c1 into r0
asm volatile( " bic r0, r0, #4096" ); // Clearr bit 12: Icache
asm volatile( " mcr p15, 0, r0, c1, c0, 0" ); // Return r0 to c1
}