Chinaunix首页 | 论坛 | 博客
  • 博客访问: 212069
  • 博文数量: 32
  • 博客积分: 410
  • 博客等级: 一等列兵
  • 技术积分: 396
  • 用 户 组: 普通用户
  • 注册时间: 2012-04-03 16:58
文章分类

全部博文(32)

文章存档

2013年(17)

2012年(15)

我的朋友

分类: 嵌入式

2012-05-30 16:20:27




在看此笔记之前,童鞋们一定要了解mips的异常的种类和特性(优先级);以及入口地址;
了解通常中断的入口和初始化;(我真的看了老久了)
中心思想:学习流程!

mips通用异常(中断)的机器指令入口地址0x80000180(no-tlb,cached),
此处的指令:在初始化的时候来安排:set_handler(0x180, &except_vec3_generic, 0x80);
cpu发生什么异常,在此处需要一个简单的处理;(不用找,只能是汇编)
//......................................
except_vec3_generic:汇编指令;
NESTED(except_vec3_generic, 0, sp)
    .set    push
    .set    noat

    mfc0    k1, CP0_CAUSE
    andi    k1, k1, 0x7c
//查看是哪一种通用异常(下面有cause寄存器):
    PTR_L    k0, exception_handlers(k1)//通过set_except_vector给exception_handlers添加所有的入口;
    jr    k0
    .set    pop
    END(except_vec3_generic)
这样说明一点,现场的保护由异常具体情况来执行的;


 
                                上图是状态寄存器和cause寄存器


//..........................................................................................
下面以exception_handlers[0]来说明中断类异常的操作流程;
NESTED(handle_int, PT_SIZE, sp)

    SAVE_ALL//保持进程上下文;
    CLI//关中断;
    //TRACE_IRQS_OFF

//但是不明白的是,为什么会暂存在S0;传递给ret_form_irq??
(ret_form_irq)会执行LONG_S    s0, TI_REGS($28)
//推测,如果new stack的话,TI_REGS($28)为NULL;
//推测,如果old stack的话,TI_REGS($28)为ti的地址TI_REGS($28)==$28?
//来自save_all;
    LONG_L    s0, TI_REGS($28)
    LONG_S    sp, TI_REGS($28)
//?????
    //存入sp;thread_info的寄存器指针regs指向sp的位置,也就是PT_reg的位置
    //有什么作用?在plat_irq_dispatch上会被使用到?还是debug时用到?
    PTR_LA    ra, ret_from_irq//handle执行完毕之后的返回地址;
    j    plat_irq_dispatch//路径分发:处理具体的问题;
    END(handle_int)

最重要的地方就是ra=ret_form_irq;在handle_int执行后就是执行它了;
//..................................................................................





阅读(5681) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~