Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2764973
  • 博文数量: 505
  • 博客积分: 1552
  • 博客等级: 上尉
  • 技术积分: 2514
  • 用 户 组: 普通用户
  • 注册时间: 2007-09-23 18:24
文章分类

全部博文(505)

文章存档

2019年(12)

2018年(15)

2017年(1)

2016年(17)

2015年(14)

2014年(93)

2013年(233)

2012年(108)

2011年(1)

2009年(11)

分类: 嵌入式

2013-04-08 08:56:23

原文地址:mips中断处理框架 作者:mymips




在看此笔记之前,童鞋们一定要了解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执行后就是执行它了;
//..................................................................................





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