2440mmu 代码(arm-linux-gcc)疑惑
下面的一段代码是在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下怎么改? 错误提示是什么? http://cache.amobbs.com/bbs_upload782111/files_14/ourdev_441602.jpg
(原文件名:截图00.jpg)
如图所示
好像是语法问题,可能 gcc的汇编语法跟ads的汇编语法不太一致 我知道怎么改了 代码如下void mmu_init(void)
{
__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, #0x30000000 /* 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 /* 将修改的值写入控制寄存器 */
}
原程序这两句话的意思就是将ttb这两个变量赋值给一个寄存器(由cpu自动选择哪个寄存器,然后用%0来表示这个寄存器的值)可以直接将地址值赋值给r4就可以了,编译通过并下到板子可以执行,该程序在网上有很多的副本,但是没有在ads环境下的。这也算是gcc嵌入汇编跟ads的嵌入汇编的一点区别吧,希望对有用的人有帮助!
页:
[1]