Linux学习_异常与中断

不同芯片处理差别

事件cortex M3/M4cortex A7
保存/恢复现场硬件实现软件实现
处理异常向量表上放置的是函数地址向量表上放置的是跳转指令

cortex M3/M4

M3/M4的向量表中,放置的是具体异常/中断的处理函数的地址
发生异常/中断时,硬件上实现了这些事情:

  • 保存现场:把被中断瞬间的寄存器的值保存进
  • 根据异常/中断号,从向量表中得到函数地址,跳转过去执行
  • 函数执行完后,从栈中恢复现场

我们只需要在向量表中,把处理函数的地址填进去就可以了。

cortex A7

A7的向量表中,放置的是某类异常的跳转指令
发生异常/中断时,硬件上实现了这些事情:

  • CPU切换到对应的异常模式,比如IRQ模式、未定义模式、SVC模式(根据向量表中的跳转指令

  • 保存被中断时的CPSR到SPSR

    • CPSR:current program status register,当前程序状态寄存器
    • SRSR:saved program status register,保存的程序状态寄存器
  • 跳到这个异常的入口地址去,执行指令,这通常是一条跳转指令,跳转到对应软件开始执行

软件要做的事情就比较多了:

  • 保存现场
  • 分辨具体是模式中的哪种异常/中断
  • 调用对应的处理函数
  • 恢复现场

保存现场

由于不同芯片寄存器分布的不同,保存现场的操作也有所不同。

cortex M3/M4

在这里插入图片描述
执行函数A时,异常->执行函数B
那么A将自己去保存R0-R3,R12,LR,PSR;B如果不用剩下的寄存器,那B就不管了,如果可能调用到,B会提前保存R4-R11
M3/M4在调用异常处理函数前,把LR设置为一个特殊的值,转给特殊的值被称为EXC_RETURN
当PC寄存器的值等于EXC_RETURN时,会触发异常返回机制,简单地说:会从栈里恢复R0-R3,R12,LR,PC,PSR等寄存器。

M3/M4有两个操作模式

  1. 处理模式:执行中断服务程序等异常处理时,处于处理模式
  2. 线程模式:执行普通应用程序代码时,处于线程模式

cortex A7

A7有九个操作模式:User、Sys、FIQ、IRQ、ABT、SVC、UND、MON、HYP。
各个操作模式都有自己的SP寄存器,即有自己的栈,还有自己的SPSR寄存器。(User和Sys共用一套如上图的寄存器)
硬件执行模式跳转指令后,我们要自己给对应模式设置栈等寄存器的初始化。
软件保存现场:将R0-R3、R12、LR保存到对应模式的SP寄存器(栈)中。
举例:快中断模式下(FIQ),FIQ有很多自己的寄存器供处理异常使用,所以很多寄存器不用保存现场,省事

中断特性(后期补充)

  1. Linux将中断分为硬件中断(如按键中断)和软件中断(如定时器中断),一般优先级先硬后软。
  2. 中断不能嵌套,中断中再来中断再来中断 no ,套不了几个娃栈就爆炸了
  3. 中断期间程序运行不了,咋办捏,要么给中断处理函数整简洁点,要么就少占用一会中断(展开讲讲这个)
    少占用一会中断这个方案,通过拆分处理函数实现,上半部执行紧急事件,剩下的不太急的下半部执行时,别的中断就能打断了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值