免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: sainimu78

[BootLoader] 开了MMU后 调试工具提示不能访问下一条指令 , 怎么办? [复制链接]

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:58:11
发表于 2013-12-25 17:06 |显示全部楼层
这个页表感觉设置的有问题,宏FL_SECTION_ENTRY 的定义不对,有些位没有设置,最好对照arm官方的arm1176jzf-s手册来设置页表

论坛徽章:
0
发表于 2013-12-26 00:09 |显示全部楼层
回复 10# linyunxian


    太遗憾了 没看懂

论坛徽章:
0
发表于 2013-12-27 19:58 |显示全部楼层
回复 12# sainimu78


    打开mmu之后,可能需要你重新加载符号表。让符号表与当前的cpu值一致。这样就可以继续调试了。

论坛徽章:
0
发表于 2014-01-08 18:54 |显示全部楼层
回复 11# arm-linux-gcc

我自己还不懂怎么写 手册搜索mmu居然没找到有用的信息

刚才抄了三星提供的mmu初始化代码

用JLINK可以正常调试了  , 但下到nand里再启动居然又死机了

是死在初始化uart的时候

rUINTP0 = (TXD_BIT|ERR_BIT|RXD_BIT);  这句后就死了

我还把定时器初始化放在uart之前 然后用while(1);卡住观察定时器中断能不能工作 , 结果是可以的 , 没问题


这又会是怎么回事呢 , 想不出

论坛徽章:
0
发表于 2014-01-08 18:55 |显示全部楼层
回复 13# linyunxian


    真不懂 , 我太菜了

论坛徽章:
0
发表于 2014-01-08 19:16 |显示全部楼层
回复 11# arm-linux-gcc


那个mmu初始化 ,

    void SYSTEM_SetMmuMtt(u32 vaddrStart,u32 vaddrEnd,u32 paddrStart,u32 attr)
{
    u32 *pTT;
    int i,nSec;

    pTT                =        (u32 *)_MMUTT_BaseAddress+(vaddrStart>>20);
    nSec        =        (vaddrEnd>>20)-(vaddrStart>>20);

    for(i=0;i<=nSec;i++)
            *pTT++        =        attr | (((paddrStart>>20)+i)<<20);
}

//////////
// Function Name : SYSTEM_InitMmu
// Function Description :
// Input : NONE
// Output : NONE
// Version :

#define rMEM_CFG_STAT                (SYSCON_BASE+0x12c)
void SYSTEM_InitMmu(void)
{

        //========================== IMPORTANT NOTE =========================
        //The current stack and code area can't be re-mapped in this routine.
        //If you want memory map mapped freely, your own sophiscated MMU
        //initialization code is needed.
        //===================================================================

        SYSTEM_DisableICache();
        SYSTEM_DisableDCache();

        SYSTEM_InvalidateEntireICache();
        SYSTEM_CleanInvalidateEntireDCache();

        SYSTEM_DisableMMU();
        SYSTEM_InvalidateTLB();

        //        SROM
        if( (SYSC_GetMEMCFGSTAT()&(0x3<<5)) != (2<<5) )
        {
                SYSTEM_SetMmuMtt(0x00000000,0x07f00000,0x00000000,RW_NCNB);        //mirroed region
                SYSTEM_SetMmuMtt(0x08000000,0x0bf00000,0x08000000,RW_NCNB);        //internal rom
                SYSTEM_SetMmuMtt(0x0c000000,0x0ff00000,0x0c000000,RW_NCNB);        //stepping stone
        }
        else
        {
                //Only for OneNand Booting Mode..Map00 error
                SYSTEM_SetMmuMtt(0x0c000000,0x0ff00000,0x00000000,RW_NCNB);        //mirroed region
                SYSTEM_SetMmuMtt(0x04000000,0x07f00000,0x04000000,RW_NCNB);
                SYSTEM_SetMmuMtt(0x08000000,0x0bf00000,0x08000000,RW_NCNB);        //internal rom
                SYSTEM_SetMmuMtt(0x00000000,0x03f00000,0x0c000000,RW_NCNB);        //stepping stone
        }
        SYSTEM_SetMmuMtt(0x10000000,0x17f00000,0x10000000,RW_NCNB);        //nCS0
        SYSTEM_SetMmuMtt(0x18000000,0x1ff00000,0x18000000,RW_NCNB);        //nCS1
        SYSTEM_SetMmuMtt(0x20000000,0x27f00000,0x20000000,RW_NCNB);        //nCS2
        SYSTEM_SetMmuMtt(0x28000000,0x2ff00000,0x28000000,RW_NCNB);        //nCS3
        SYSTEM_SetMmuMtt(0x30000000,0x37f00000,0x30000000,RW_NCNB);        //nCS4
        SYSTEM_SetMmuMtt(0x38000000,0x3ff00000,0x38000000,RW_NCNB);        //nCS5

        //        SDRAM (MEM Port0)

        SYSTEM_SetMmuMtt(_DRAM0_BaseAddress+0x00000000,_DRAM0_BaseAddress+0x03ffffff,_DRAM0_BaseAddress+0x00000000,RW_NCNB);

        //        SDRAM (MEM Port1)
        SYSTEM_SetMmuMtt(_DRAM_BaseAddress+0x00000000,_DRAM_BaseAddress+0x00f00000,_DRAM_BaseAddress+0x00000000,RW_CB);
        SYSTEM_SetMmuMtt(_DRAM_BaseAddress+0x01000000,_DRAM_BaseAddress+0x07e00000,_DRAM_BaseAddress+0x01000000,RW_NCNB);
        SYSTEM_SetMmuMtt(_DRAM_BaseAddress+0x07f00000,_DRAM_BaseAddress+0x07f00000,_DRAM_BaseAddress+0x07f00000,RW_CB);

        //        SFR & Etc
        SYSTEM_SetMmuMtt(0x70000000,0x7ff00000,0x70000000,RW_NCNB);  //SFR

        //TCM
        SYSTEM_SetMmuMtt(0x80000000,0x80f00000,0x80000000,RW_NCNB);

        SYSTEM_SetTTBase(_MMUTT_BaseAddress);

        //DOMAIN1: no_access, DOMAIN0,2~15=client(AP is checked)
        SYSTEM_SetDomain(0x55555550|DOMAIN1_ATTR|DOMAIN0_ATTR);

        SYSTEM_SetFCSEPID(0x0);
        SYSTEM_EnableAlignFault();

        SYSTEM_EnableMMU();
        SYSTEM_EnableICache();
        SYSTEM_EnableDCache(); //DCache should be turned on after MMU is turned on.
        SYSTEM_EnableBP();

}

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:58:11
发表于 2014-01-08 19:19 |显示全部楼层
本帖最后由 arm-linux-gcc 于 2014-01-08 19:20 编辑
sainimu78 发表于 2014-01-08 18:54
回复 11# arm-linux-gcc

我自己还不懂怎么写 手册搜索mmu居然没找到有用的信息


1,如果去掉“rUINTP0 = (TXD_BIT|ERR_BIT|RXD_BIT); ”这一句呢?
2,你说的死了,到底是发生了那种异常?死机也分好多种的
3,你的页表映射了串口所在地址吗?

论坛徽章:
0
发表于 2014-01-08 20:45 |显示全部楼层
回复 17# arm-linux-gcc

void uart0_int_init(void)
{

rUINTM0 |= (TXD_BIT|ERR_BIT|RXD_BIT);//没卡 地址0x7F005038
rUINTP0 = (TXD_BIT|ERR_BIT|RXD_BIT); //卡死       0x7F005030
rUINTSP0 = (TXD_BIT|ERR_BIT|RXD_BIT);//卡死      0x7F005034

VIC1VECTADDR5 = (unsigned int)irq_uart0;//没卡     0x71300114

rVIC1INTENABLE |= 0x1<<(37-32); //没卡               0x71300010   
rUINTM0 &= ~(ERR_BIT|RXD_BIT); //卡死                0x7F005038
}
卡没卡是加上 while(1)led();//闪灯 后测试出来的


死机的现象就是执行不到while(1)led();//闪灯


//        SFR & Etc
SYSTEM_SetMmuMtt(0x70000000,0x7ff00000,0x70000000,RW_NCNB);  //SFR
这句应该就有映射到串口了吧 ,

论坛徽章:
0
发表于 2014-01-08 22:27 |显示全部楼层
回复 17# arm-linux-gcc


应该还是表不对造成的 , 如果把uart初始化的函数去了 , 虽然不会死机(LED还会闪 , 但闪的规律不是我设定的) , 但运行效果完全和在线调的时候不一样

论坛徽章:
0
发表于 2014-01-09 21:24 |显示全部楼层
mark......
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP