jiangkaibo1987 发表于 2009-5-1 21:02:08

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下怎么改?

wanmyqawdr 发表于 2009-5-2 01:39:58

错误提示是什么?

jiangkaibo1987 发表于 2009-5-2 21:32:25

http://cache.amobbs.com/bbs_upload782111/files_14/ourdev_441602.jpg
(原文件名:截图00.jpg)
如图所示
好像是语法问题,可能 gcc的汇编语法跟ads的汇编语法不太一致

jiangkaibo1987 发表于 2009-5-3 22:56:21

我知道怎么改了 代码如下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]
查看完整版本: 2440mmu 代码(arm-linux-gcc)疑惑