您当前的位置: 首页 > 

韦东山

暂无认证

  • 0浏览

    0关注

    506博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

新1期视频第14课und异常中断模式的bug以及对应的解决方法

韦东山 发布时间:2019-01-07 11:38:01 ,浏览量:0

正在学习新1期第14课und异常模式程序示例的同学,可能会发现014_und_exception_014_004\001的代码存在如下BUG,学员在论坛反馈后,我们已经第一时间解决,下面将以对话的形式完整的呈现这个解决方案。

**学员azoxi:**对ARM裸机加强版-第14课 und异常模式有打印异常疑惑,以下是我的start.S 代码(在源码基础上稍作修改):

.text
.global _start

_start:
        b reset   /*vector 0 : reset*/
        b do_und  /*vector 4 : undefined*/

do_und:

        /* 执行到这里之前:
         * 1. lr_und保存有被中断模式中的下一条即将执行的指令的地址
         * 2. SPSR_und保存有被中断模式的CPSR
         * 3. CPSR中的M0-M4被设置为11011,进入到und模式
         * 4. 跳转到0x4的地址执行程序
         */

        /*sp_und 这个模式下的栈还未设置,先设置它*/
        ldr sp, =0x34000000

        /*保存现场*/
        /*在und异常处理函数中有可能会修改r0-r12寄存器的值,所以先保存*/
        /*lr是异常处理完后的返回地址,也需要保存*/
        stmdb sp!, {r0-r12, lr}

        /*处理异常*/
        mrs r0, cpsr
        ldr r1, =und_string
        bl printException

        /*恢复现场*/
        ldmia sp!, {r0-r12, pc}^  /*^会把spsr的值回复到cpsr中*/

und_string:
        .string "undefined instruction exception"        

reset:
        /* 关闭看门狗 */
        ldr r0, =0x53000000
        ldr r1, =0
        str r1, [r0]

        /* 设置MPLL, FCLK : HCLK : PCLK = 400m : 100m : 50m */
        /* LOCKTIME(0x4C000000) = 0xFFFFFFFF */
        ldr r0, =0x4C000000
        ldr r1, =0xFFFFFFFF
        str r1, [r0]

        /* CLKDIVN(0x4C000014) = 0X5, tFCLK:tHCLK:tPCLK = 1:4:8  */
        ldr r0, =0x4C000014
        ldr r1, =0x5
        str r1, [r0]

        /* 设置CPU工作于异步模式 */
        mrc p15,0,r0,c1,c0,0
        orr r0,r0,#0xc0000000   //R1_nF:OR:R1_iA
        mcr p15,0,r0,c1,c0,0

        /* 设置MPLLCON(0x4C000004) = (92            
关注
打赏
1658827356
查看更多评论
0.0392s