S3C2440之MMU驱动代码模板(RealView MDK)(二)

2015-07-20 17:13:42 ? 作者: ? 浏览: 9
00; paddr += 0x100000; } }
MMU初始化:

?

?

void MMU_Init(void)
{
	MMU_DisableICache();
	MMU_DisableDCache();
	
	MMU_SetTTB();
	MMU_SetDomain(0xFFFFFFFF);
	MMU_InvalidAllTLB();
	MMU_EnableAlignFault();
	
	MMU_SetMTT(0x00000000, 0x001FFFFF, 0x00000000, RW_CB);
	MMU_SetMTT(0x30000000, 0x33FFFFFF, 0x30000000, RW_CB);
	MMU_SetMTT(0x40000000, 0x4FFFFFFF, 0x40000000, RW_NCNB);
	MMU_SetMTT(0x50000000, 0x5FFFFFFF, 0x50000000, RW_NCNB);
	
	MMU_EnableICache();
	MMU_EnableDCache();
	MMU_Enable();
}

在本代码中需要注意的是,如果直接使用S3C2440.s的话,在C代码中调用上述代码会导致Undefine异常。因为进入main()之前,启动代码已经将处理器模式设置为USER模式了,而在USER模式下是无法操作CP15处理器的,所以产生异常。如果要在C中正常调用上述嵌入汇编,则需要将启动代码S3C2440.s中处理器模式设置为USER模式的那段代码注释掉,直接以SVC模式运行,就能正常执行,如下:

?

;  Enter Supervisor Mode and set its Stack Pointer
                MSR     CPSR_c, #Mode_SVC:OR:I_Bit:OR:F_Bit
                MOV     SP, R0
                SUB     R0, R0, #SVC_Stack_Size

;  Enter User Mode and set its Stack Pointer
;                MSR     CPSR_c, #Mode_USR
;                MOV     SP, R0
;                SUB     SL, SP, #USR_Stack_Size

;  Enter User Mode and set its Stack Pointer
;                MSR     CPSR_c, #Mode_USR
;                IF      :DEF:__MICROLIB

;                EXPORT __initial_sp

;                ELSE

;                MOV     SP, R0
;                SUB     SL, SP, #USR_Stack_Size

;                ENDIF

?

或者不修改处理器模式,而直接将以下汇编插入到S3C2440.s中Clock设置代码的后面,一样能运行:

?

mrc p15, 0, r0, c1, c0, 0 
orr r0, r0, #0xc0000000 
mcr p15, 0, r0, c1, c0, 0 


?

?

?

-->

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: