天嵌 ARM开发社区

 找回密码
 注册
查看: 1716|回复: 4

[0xe8bd4008] * ldmfd r13!,{r3,r14}执行产生未定义中断

[复制链接]
yuanruizhang 发表于 2014-3-1 10:06:00 | 显示全部楼层 |阅读模式
本帖最后由 yuanruizhang 于 2014-3-3 00:11 编辑

今天在做mmu的实验的时候,执行到[0xe8bd4008] * ldmfd    r13!,{r3,r14}的时候,产生未定义中断!搞不清楚问题是怎么产生的,请高手帮忙看看!
    MMU_SetProcessID(0x0);                  //设置进程号
[0xe3a00000]   mov      r0,#0
[0xeb000027]   bl       MMU_SetProcessID
        MMU_EnableAlignFault();                                        //               
[0xeb000028]   bl       MMU_EnableAlignFault
        MMU_Enable();   
[0xeb00001b]   bl       MMU_Enable
        MMU_EnableICache();   
[0xeb00000e]   bl       MMU_EnableICache
        MMU_EnableDCache(); //DCache should be turned on after MMU is turned on.
[0xe8bd4008] * ldmfd    r13!,{r3,r14}
[0xea000004]   b        MMU_EnableDCache
[0x00000c1e]   dcd      0x00000c1e  ....

 楼主| yuanruizhang 发表于 2014-3-1 10:51:28 | 显示全部楼层
找到原因是因为地址映射问题。SDRAM的地址我只映射到了0x30000000~0x31000000.将0x31000000修改为0x34000000.就可以了。但是又没有搞明白GPB的端口没有映射成功!
void CreatePageTable(void)
{
        unsigned long VA,PA;
        unsigned long *MmuTLBBase = (unsigned long *)TTB_Base;        //映射的TLB地址
       
        /*
        Steppingstone的起始物理地址为0,第一部分程序的起始运行地址也是0,
        为了在开启MMU后仍能运行第一部分的程序,将0~1M的虚拟地址映射到同样的物理地址
        此处VA>>20后加上MmuTLBBase:编译器会在当VA>>20加MmuTLBBase之前将VA>>20在左移2位。
        */
        VA=0;
        PA=0;
        *(MmuTLBBase+(VA>>20))=((PA & 0xFFF00000)|RW_CB);

        /*
                0x56000000是GPIO寄存器的起始物理地址,GPBCON和GPBDAT这两个寄存器的物理地址是0x56000010,
                0x56000014,为了在第二部分程序中能以地址0xA0000010和0xA0000014来操作GPBCON、GPBDAT,
                把从0xA0000000开始的1MB虚拟地址空间映射到0x56000000开始的1MB物理地址空间
        */
        VA = 0xA0000000;
        PA = 0x56000000;
        *(MmuTLBBase+(VA>>20))=((PA & 0xFFF00000)|RW_CB);

        /*
                SDRAM的物理地址范围是0x30000000~0x33FFFFFF,
                将虚拟地址0x30000000~0x33FFFFFF映射到物理地址0x30000000~0x33FFFFFF
                总共64MB,涉及64个段描述符
        */
        VA = 0x30000000;
        PA = 0x30000000;
        while(VA<0x34000000)
        {
                *(MmuTLBBase+(VA>>20))=((PA & 0xFFF00000)|RW_CB);
                VA += 0x100000;                                //段是以1MB,所以需要每次加1MB
                PA += 0x100000;
        }
}
这段代码参考韦老师的书上写的!但是GPB没有映射成功!各位帮忙看看原因呢!
 楼主| yuanruizhang 发表于 2014-3-2 12:07:35 | 显示全部楼层
今天继续找这个问题的原因,在用AXD软件仿真测试时,发现GPB的地址映射成功,并且操作虚拟地址,对应的物理也有变化,但是实际现在到开发板上后就LED灯却没有反应,暂时没有找到原因。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
 楼主| yuanruizhang 发表于 2014-3-2 17:02:03 | 显示全部楼层
问题找到了,是MMU配置有问题,修改MMU的配置之后,就正常了。
 楼主| yuanruizhang 发表于 2014-3-2 17:04:00 | 显示全部楼层
找到原因,是MMU的配置有问题,修改MMU的配置之后,LED灯就正常了!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号 )

GMT+8, 2024-5-3 11:43 , Processed in 1.046875 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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