搜索
bottom↓
回复: 3

2440mmu 代码(arm-linux-gcc)疑惑

[复制链接]

出0入0汤圆

发表于 2009-5-1 21:02:08 | 显示全部楼层 |阅读模式
下面的一段代码是在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周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2009-5-2 01:39:58 | 显示全部楼层
错误提示是什么?

出0入0汤圆

 楼主| 发表于 2009-5-2 21:32:25 | 显示全部楼层

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

出0入0汤圆

 楼主| 发表于 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的嵌入汇编的一点区别吧,希望对有用的人有帮助!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-20 17:45

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表