|
下面的一段代码是在linux-gcc下编的,我想在 ads下编译
void mmu_init(void)
{
unsigned long ttb = 0x30000000;
__asm{
mov r0, #0
mcr p15, 0, r0, c7, c7, 0 /* 使无效ICaches和DCaches */
mcr p15, 0, r0, c7, c10, 4 /* drain write buffer on v4 */
mcr p15, 0, r0, c8, c7, 0 /* 使无效指令、数据TLB */
mov r4, %0 /* r4 = 页表基址 */
mcr p15, 0, r4, c2, c0, 0 /* 设置页表基址寄存器 */
mvn r0, #0
mcr p15, 0, r0, c3, c0, 0 /* 域访问控制寄存器设为0xFFFFFFFF,
* 不进行权限检查
*/
/*
* 对于控制寄存器,先读出其值,在这基础上修改感兴趣的位,
* 然后再写入
*/
mrc p15, 0, r0, c1, c0, 0 /* 读出控制寄存器的值 */
/* 控制寄存器的低16位含义为:.RVI ..RS B... .CAM
* R : 表示换出Cache中的条目时使用的算法,
* 0 = Random replacement;1 = Round robin replacement
* V : 表示异常向量表所在的位置,
* 0 = Low addresses = 0x00000000;1 = High addresses = 0xFFFF0000
* I : 0 = 关闭ICaches;1 = 开启ICaches
* R、S : 用来与页表中的描述符一起确定内存的访问权限
* B : 0 = CPU为小字节序;1 = CPU为大字节序
* C : 0 = 关闭DCaches;1 = 开启DCaches
* A : 0 = 数据访问时不进行地址对齐检查;1 = 数据访问时进行地址对齐检查
* M : 0 = 关闭MMU;1 = 开启MMU
*/
/*
* 先清除不需要的位,往下若需要则重新设置它们
*/
/* .RVI ..RS B... .CAM */
bic r0, r0, #0x3000 /* ..11 .... .... .... 清除V、I位 */
bic r0, r0, #0x0300 /* .... ..11 .... .... 清除R、S位 */
bic r0, r0, #0x0087 /* .... .... 1... .111 清除B/C/A/M */
/*
* 设置需要的位
*/
orr r0, r0, #0x0002 /* .... .... .... ..1. 开启对齐检查 */
orr r0, r0, #0x0004 /* .... .... .... .1.. 开启DCaches */
orr r0, r0, #0x1000 /* ...1 .... .... .... 开启ICaches */
orr r0, r0, #0x0001 /* .... .... .... ...1 使能MMU */
mcr p15, 0, r0, c1, c0, 0 /* 将修改的值写入控制寄存器 */
/* 无输出 */
r (ttb) };
}
最后一句 应该r (ttb)和上面的mov r4, %0 /* r4 = 页表基址 */
好像编译有问题,请问在ads下怎么改? |
阿莫论坛20周年了!感谢大家的支持与爱护!!
一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。
|